1

我在用户和设置模型之间有一个 has_one 关联。我也有带有编辑和更新操作的 SettingsController。在首页我有一个编辑设置的链接:

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

这导致 ActionController::RoutingError No route matches {:controller=>"settings", :action=>"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"}

另一种猜测是控制器名称(SettingsController)在使用 has_one 关联时应该是单数,而不是复数。出于某种奇怪的原因,Rails 没有注意到我的控制器,即使它非常存在。

帮助表示赞赏。

4

4 回答 4

2

尝试使用复数形式的名称:设置无处不在。

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

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

Rails 会自动以复数形式命名模型。在您的示例中,您有一个奇怪的复数和单数名称组合,请查看。都应该是复数。

于 2011-07-08T20:34:19.167 回答
1

好的,首先为什么要使用自己的控制器来设置用户而不是设计?那是在 edit_user_registration_path

  • 你的路径没关系,它必须是复数,因为你在:as参数中定义了它

另一个评论是,如果您正在使用,resources :setting, :only => [:edit, :update] 为什么要使用下一行?那条路径,我的意思是,如果你这样声明,你可以使用edit_setting_path(id)

于 2011-07-08T20:27:45.867 回答
0

啊,我找到了这个问题的根源。谢谢各位,给了我一些思路。问题是我正在迁移用户模型以开始使用设置模型,而我使用的用户没有任何设置(这有点奇怪,因为我在 rails 控制台中创建了它,而且看起来一切都很好)。所以设置对象是 nil,昨天这让 rails 发疯了。我第一次看到各种错误。

是的,设置的资源路由应该是单数的,因为它使用 has_one 关联。在 routes.rb 中的第二行,我试图让用户使用更简单的 url(如 .../settings )来获取他的所有设置。

我也尝试过使用 Devise 的 edit_user_registration_path,但上次出了点问题。恐怕得再考虑一下了。

谢谢大家!

于 2011-07-09T11:44:54.593 回答
-1

在您的 link_to 方法调用中,尝试使用 setting_path(单数)而不是 settings_path。

<%= link_to (setting_path(current_user.setting)), do %>
于 2011-07-08T20:37:48.673 回答