2011-07-08 77 views
1

我在用戶和設置模型之間有一個has_one關聯。我也有設置控制器與編輯和更新操作。在頭版我有一個鏈接編輯設置:Rails:沒有路由匹配{:controller =>「settings」,:action =>「edit」}

<%= link_to (settings_path(current_user.setting)), do %> 
.. 
<% end %> 

這造成的ActionController :: RoutingError 沒有路由匹配{:控制器=> 「設置」,:動作=> 「編輯」} ..when嘗試顯示首頁。

我有點卡住了我的頭圍繞爲什麼發生這種情況。使用Devise進行用戶認證,這個current_user應該是一個全局變量。

這裏是如何路由在routes.rb中定義:

resources :setting, :only => [:edit, :update] 
    match '/settings/:id' => "settings#edit", :controller => :setting, :as => :settings 

這裏是耙路線將返回:

edit_setting GET /setting/:id/edit(.:format)     {:action=>"edit", :controller=>"setting"} 
     setting PUT /setting/:id(.:format)      {:action=>"update", :controller=>"setting"} 
     settings  /settings/:id(.:format)      {:controller=>"settings", :action=>"edit"} 

另一種猜測是,控制器的名稱(SettingsController)應爲單數,在使用has_one關聯時不是複數。出於某種奇怪的原因,Rails並沒有注意到我的控制器,儘管它非常有用。

幫助表示讚賞。

+0

你可以把你的型號代碼請 – eveevans

回答

1

好吧,firts爲什麼你將自己的控制器用於用戶設置而不是設計? 這是edit_user_registration_path

  • 你的路這是確定,它必須是複數的,因爲你在:as參數

另一個意見是定義它,如果你是爲什麼您使用使用resources :setting, :only => [:edit, :update] 下一行?我的意思是,如果你聲明這樣,你可以使用edit_setting_path(id)

2

嘗試使用複數名稱:無處不在的設置。

<%= link_to (settings_path(current_user.settings)), do %> 
... 

match '/settings/:id' => "settings#edit", :controller => :settings, :as => :settings 
... 

Rails自動命名複數模型。在你的例子中,你有複數和單數名字的奇怪混合,請檢查出來。所有應該是複數。

+0

+1。它也可能值得更改'resources:setting,:only => [:edit,:update]'爲多種格式,例如:'resources:settings,:only => [:edit,:update]'。我不確定是否有必要。 – stephenmurdoch

+0

但has_one關係必須是單數<< – eveevans

-1

在你的link_to方法調用中,嘗試使用setting_path(單數)而不是settings_path。

<%= link_to (setting_path(current_user.setting)), do %> 
0

啊,我發現了這個問題的根本問題。謝謝,夥計們,你給了我一些想法。事情是,我正在遷移用戶模型以開始使用設置模型,並且我使用的用戶沒有任何設置(這有點奇怪,因爲我在軌道控制檯中創建了它,並且看起來都很好)。所以設定的對象是零,這是昨天讓鐵軌瘋狂。我第一次看到所有的錯誤。

是的,設置的資源路由應該是單數的,因爲它使用has_one關聯。隨着我的第二行routes.rb我試圖讓用戶所有的設置與一個更簡單的網址,如... /設置。

我也嘗試過使用Devise的edit_user_registration_path,但上次出了點問題。可能不得不重新考慮一下。

感謝大家!

相關問題