我在用户和设置模型之间有一个has_one关联。我还有SettingsController,其中包含编辑和更新操作。在首页,我有一个编辑设置的链接:
<%= link_to (settings_path(current_user.setting)), do %>
..
<% end %>
导致ActionController :: RoutingError 没有路由匹配{:controller =&gt;“settings”,:action =&gt;“edit”} ..当试图显示首页时。
我有点无法理解为什么会发生这种情况。使用Devise进行用户身份验证,此current_user应该是一个全局变量。
以下是在routes.rb中定义路由的方法:
resources :setting, :only => [:edit, :update]
match '/settings/:id' => "settings#edit", :controller => :setting, :as => :settings
以下是rake路线返回的内容:
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"}
另一个猜测是,当使用has_one关联时,控制器名称(SettingsController)应该是单数,而不是复数。由于一些奇怪的原因,Rails没有注意到我的控制器,即使它很存在。
非常感谢帮助。
答案 0 :(得分:2)
尝试使用复数名称:设置无处不在。
<%= link_to (settings_path(current_user.settings)), do %>
...
match '/settings/:id' => "settings#edit", :controller => :settings, :as => :settings
...
Rails自动命名多个模型。在你的例子中,你有一个奇怪的复数名称复数和单数,检查出来。所有都应该是复数。
答案 1 :(得分:1)
好的,为什么你使用自己的控制器来设置用户而不是设计呢?
在edit_user_registration_path
:as
参数另一个评论是,如果您使用resources :setting, :only => [:edit, :update]
你为什么要使用下一行?那条路,我的意思是,如果你这样说,你可以使用edit_setting_path(id)
答案 2 :(得分:0)
啊,我找到了根本问题。谢谢,伙计们,你给了我一些想法。问题是我正在迁移用户模型以开始使用设置模型,而我使用的用户没有任何设置(这有点奇怪,因为我在rails控制台中创建它并且它看起来都很好)。所以设置对象是零,这是昨天疯狂的铁路。我第一次看到了各种各样的错误。
是的,设置的资源路由应该是单一的,因为它使用的是has_one关联。我在routes.rb的第二行,我试图用一个更简单的网址来设置用户所有的设置,如... / settings。
我也尝试过使用Devise的edit_user_registration_path,但上次出了点问题。可能不得不另外考虑一下。
感谢大家!
答案 3 :(得分:-1)
在你的link_to方法调用中,尝试使用setting_path(singular)而不是settings_path。
<%= link_to (setting_path(current_user.setting)), do %>