Rails:没有路由匹配{:controller =>“settings”,:action =>“edit”}

时间:2011-07-08 20:08:28

标签: ruby-on-rails ruby routing controller has-one

我在用户和设置模型之间有一个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没有注意到我的控制器,即使它很存在。

非常感谢帮助。

4 个答案:

答案 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 %>