我在has_one关联模型上使用accepts_nested_attributes_for。
我有两个模型,一个用户和一个个人资料。用户有一个配置文件:
class User < ActiveRecord::Base
attr_accessible :name, :email,:profile_attributes
has_one :profile
accepts_nested_attributes_for :profile
end
class Profile < ActiveRecord::Base
attr_accessible :avatar
belongs_to :user
mount_uploader :avatar, AvatarUploader
end
我在编辑用户页面上有两个表单。一个更新主要用户属性(并且工作正常但未在下面显示)然后允许用户上传头像的那个:
<%= form_for @user, :html => {id: 'avatar_form' ,:multipart => true } do |f| %>
<%= f.fields_for :profile do |builder| %>
<%= builder.file_field :avatar %>
<% end %>
<%= f.submit %>
<% end %>
此提交不起作用,我收到此错误消息:
UsersController#update中的NoMethodError
nil的未定义方法`name':NilClass
我更新的UsersController代码是:
def update
@user = current_user
if @user.update_attributes(params[:user])
redirect_to home_path
else
render 'edit'
end
end
Params是:
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"YTpGnj9uIpybDAgf4c6pxMydY15ga5GZ++FBMe/6dV4=",
"user"=>{"profile_attributes"=>{"avatar"=>#<ActionDispatch::Http::UploadedFile:0x2303e08 @original_filename="test.jpg",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"user[profile_attributes][avatar]\"; filename=\"test.jpg\"\r\nContent-Type: image/jpeg\r\n",
"id"=>"3"}},
"commit"=>"Upload",
"id"=>"1"}
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
添加到您的用户控制器
def new
@user = User.new
@user.profile.build
#or
#@user.build_profile
end
为了更好地了解正在发生的事情,请尝试将gem“better_errors”添加到您的Gemfile
gem "better_errors"
您将获得一种控制台,您可以在其中键入
@user
作为输出你会得到(nil,或obj)。如果没有,你肯定会在新行动中打造这一行
@user = User.new
如果你使用divise进行自动。支持,重写控制器就像这里 Override devise registrations controller
答案 1 :(得分:0)
@Andrey 至于has_one关系, @ user.profile.build不起作用,需要选择下面的@ user.build_profile 有人告诉我如下: “如果使用has_one定义关联,我们使用”build_association“函数。对于has_many,它应该是”association.build“。