我正在学习从不同的控制器渲染表单,但是当我尝试保存数据时,它说我得到了
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
,它会改变我吗?
谢谢!
答案 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 %>