我希望根据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....
有没有办法让迭代局部变量menu
(menu.name
)包含在路径中而不是我现在拥有的黑客方式?同样基于该迭代允许link_to
执行单个控制器操作而不是多个控制器操作?
请知道您上面看到的内容有效但我正在寻找简化和 DRY 解决方案。
非常感谢任何帮助。
答案 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 %>