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 %>
我希望根据对象名称简化 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 %>