2015-06-23 36 views
0

我正在寻找简化基于thr对象名称的link_to路径,并且正在研究重构多个自定义操作。Rails - link_to基于对象名称的路径+重构多个自定义动作

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

​​

我觉得这是“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.... 

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

请知道你看到的上述工作,但我期待简化和DRY解决方案,如果可能的话。

任何帮助将不胜感激。

回答

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

感谢您的答复。你的控制器缺少括号。我重新启动服务器,并得到以下错误:'未定义的方法'techs_part_path'为#<#:0x007fd110554338>请指教。 –

+0

@captainawesome你可以运行'耙路线'并告诉我什么*路径*创建?我写了一个猜测的道路。请从'rake routes'确认它 –

+0

我的意思是说你的'view'缺少括号。 –