Rails - link_to 基于对象名称的路径 + 重构多个自定义操作

Rails - link_to path based on object's name + refactoring multiple custom actions

我希望根据对象名称简化 link_to 路径,同时也在考虑重构多个自定义操作。

我已经设法让这个在下面工作。

<% ServiceMenu.all.each do |menu| %>
      <tr class=" <%= cycle('odd', 'even') %>">
        <td><%= link_to menu.name, ("tech/""#{menu.name.parameterize}") %></td>
      </tr>
<% end %>

我觉得这很 "un-rails" 并且认为有更好的方法来执行它。 基于迭代,例如menu.name,它将转到URL例如tech/oil-change

我的控制器充满了一些我正在寻找的操作DRY

def oil_change
    @techs = Tech.joins(:services).where(services: { name: 'oil change'})
end

def muffler
    @techs = Tech.joins(:services).where(services: { name: 'muffler'})
end

etc...
etc...
etc...
etc...

路线

我的路线如下所示:

resources :techs, :only => [:index, :show], shallow: true do
    resources :cars, only: [:new, :create]
    collection do
      get 'oil-change'
      get 'brakes'
      get 'muffler'
      etc....
      etc....
      etc....
      etc....
      etc....
    end
  end

耙路

oil-change_techs / techs#oil-change
blowout_techs / techs#brakes
muffler_techs / techs#muffler
etc...._techs / techs#etc....
etc...._techs / techs#etc....
etc...._techs / techs#etc....

有没有一种方法可以将迭代局部变量 menu (menu.name) 包含在路径中,而不是像我现在这样乱搞?还基于该迭代允许 link_to 执行单个控制器操作而不是具有多个控制器操作?

请知道您在上面看到的内容有效,但如果可能,我正在寻找简化的 DRY 解决方案。

任何帮助将不胜感激。

您可以更改路线:

resources :techs, :only => [:index, :show], shallow: true do
  resources :cars, only: [:new, :create]
  collection do
    get 'part/:part_name' => "techs#part", as: :part
  end
end

然后添加动作:

def part
  @techs = Tech.joins(:services).where(services: { name: params[:part_name]})
end

视图将是:

<% ServiceMenu.all.each do |menu| %>
  <tr class=" <%= cycle('odd', 'even') %>">
    <td><%= link_to menu.name, part_techs_path(part_name: menu.name.parameterize) %></td>
  </tr>
<% end %>