2015-06-23 39 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'缺少括號。 –