ruby on rails:undefined stringify_keys

时间:2013-06-17 03:37:12

标签: ruby-on-rails ruby-on-rails-3 nested

我正在学习从不同的控制器渲染表单,但是当我尝试保存数据时,它说我得到了

NoMethodError in ProfilesController#create
undefined method `stringify_keys' for "2":String

我的路线文件:

resources :users do
  member do
   get 'profile'
  end
end

个人资料模型

belongs_to :user

用户模型

has_one :profile

视图/简档/ _form.html.erb

<%= form_for [@user, @profile] do |f| %>
  ..
<% end %>

视图/用户/ _form.html.erb

<%= render :partial => "profiles/form" %>

另外,当我尝试保存数据时,我会被重定向到发生错误的http://localhost:3000/users/2/profiles,而不是http://localhost:3000/users/2/profile 注意个人资料中的s ,它会改变我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我会采取略有不同的方法。我不会将profile的GET成员路由添加到用户资源路由,而是在用户路由中为资源嵌套资源路由。

# config/routes.rb
resources :users do
    resource :profiles // notice the singular resource
end

这将提供RESTful路由到嵌套配置文件资源所需的路由。

然后您可以按照您的指示精确创建表单:

# app/views/profiles/_form.html.erb
<%= form_for [@user, @profile] do |f| %>
    ...
<% end %>

ProfilesController中,您可以通过以下方式访问用户:

# app/controllers/profiles_controller.rb
user = User.find(params[:user_id])
profile = user.profile

我不确定这个是否肯定会解决您收到的错误消息,但很好可能

编辑:

关于下面提到表单中undefined method 'model_name' for NilClass:Class的注释:您收到此错误,因为没有变量传递到您的部分范围。渲染部分时,您需要传入您希望部分有权访问的任何局部变量:

# app/views/users/_form.html.erb
<%= render :partial => "profiles/form", :locals => {:user => @user, :profile => @profile} %>

然而,请注意,传递给partial的变量只能作为 local 变量访问,而不是实例变量:

# app/views/profiles/_form.html.erb
<%= form_for [user, profile] do |f| %>
  ...
<% end %>