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

时间:2015-06-23 03:08:46

标签: ruby-on-rails ruby refactoring

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

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

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

我认为这是“非铁轨”,并认为有更好的方法来执行此操作。 根据迭代,例如menu.name,它将转到示例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....

有没有办法让迭代局部变量menumenu.name)包含在路径中而不是我现在拥有的黑客方式?同样基于该迭代允许link_to执行单个控制器操作而不是多个控制器操作?

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以更改路线:

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 %>