Ruby on rails 在使用accepts_nested_attributes_时,在失败的创建操作上将参数传递给新模板
我可能只是错过了一些简单的东西,但我相对缺乏经验,所以很有可能。我已经广泛地寻找解决方案,但没有成功 我正在使用函数的字段\u来使用函数的接受\u嵌套属性\u来构建嵌套表单。如果表单上的提交失败,则参数仅传递给父模型的新模板的呈现。如何传递子模型的嵌套参数,以便先前填写的字段保持填充状态。请注意,我使用的是simple_form和HAML,但我认为这不会对解决方案产生太大影响 我的模型:Ruby on rails 在使用accepts_nested_attributes_时,在失败的创建操作上将参数传递给新模板,ruby-on-rails,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3.1,我可能只是错过了一些简单的东西,但我相对缺乏经验,所以很有可能。我已经广泛地寻找解决方案,但没有成功 我正在使用函数的字段\u来使用函数的接受\u嵌套属性\u来构建嵌套表单。如果表单上的提交失败,则参数仅传递给父模型的新模板的呈现。如何传递子模型的嵌套参数,以便先前填写的字段保持填充状态。请注意,我使用的是simple_form和HAML,但我认为这不会对解决方案产生太大影响 我的模型: class Account < ActiveRecord::Base attr_accessibl
class Account < ActiveRecord::Base
attr_accessible :name
has_many :users, :dependent => :destroy
accepts_nested_attributes_for :users, :reject_if => proc { |a| a[:email].blank? }, :allow_destroy => true
end
class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation
belongs_to :account
end
保存失败时,我的参数为:
:account {"name"=>"In", "users_attributes"=>{"0"=>{"email"=>"u@e.com", "password"=>"pass", "password_confirmation"=>"pass"}}}
如您所见,用户属性部分中的关键信息已存储,但我似乎无法将电子邮件地址默认设置为新表单。另一方面,帐户名根据Rails标准自动填充。我不确定该解决方案是否应该存在于accounts controller或accounts/new视图中,并且在这两个方面都没有运气
带.erb的答案当然可以
我对Ruby和Rails还比较陌生,所以非常感谢您的帮助。令人惊讶的是,在今天晚上读了一篇博客文章,并进行了多次尝试之后,我自己解决了这个问题 您需要在“新建”操作中分配一个
@user
变量,以便用户参数可用于“创建”操作。然后需要在视图中同时使用@account
和@user
变量
变化是这样的
会计主任:
def new
@account = Account.new
@account.users.build
end
def create
@account = Account.new(params[:account])
if @account.save
flash[:success] = "Welcome."
redirect_to @account
else
@account.users.build
<- I suspect I need something here but unsure what
render :new
end
end
def new
@account = Account.new
@user = @account.users.build
end
def create
@account = Account.new(params[:account])
@user = @account.users.build(params[:account][:user]
if @account.save
flash[:success] = "Welcome."
redirect_to @account
else
render :new
end
end
帐户/新视图更改为:
= simple_form_for @account do |f|
= f.input :name
= f.simple_fields_for [@account, @user] do |u|
= u.input :email
= u.input :password
= u.input :password_confirmation
= f.button :submit, :value => "Sign up"
在这种情况下,参数保持嵌套状态,但明确定义了user
组件:
:account {"name"=>"In", "user"=>{"email"=>"user@example.com", "password"=>"pass", "password_confirmation"=>"pass"}}
它还有一个额外的副作用,就是按照@numbers131407的建议,从else
路径中删除@account.users.build
我不确定它们是否是此解决方案的其他影响,我将需要在接下来的几天内解决它,但现在,如果create
操作失败,我将在视图中获得我想要的默认信息
@Beerlington和@numbers1311407我感谢您帮助我找到解决方案。问题在于
attr\u accessible
,它只指定允许批量分配的属性
我觉得有点傻,因为我昨晚在一篇评论中确实指出了这个问题,但没有注意到:
接受\u嵌套的\u属性\u for:用户将向帐户添加一个users\u attributes=writer以更新帐户的用户
这是真的,但是使用attr\u accessible:name
,您排除了除名称外的所有属性,包括users\u attributes=
。因此,当您通过account.new(params[:account])
构建新帐户时,params中传递的users\u属性将被丢弃
如果查看日志,您可能会注意到以下警告:
WARNING: Can't mass-assign protected attributes: users_attributes
您可以通过将:users\u attributes
添加到account类中的attr\u accessible
调用来解决原始问题,允许对其进行批量分配。是否需要在create语句中添加@account.users.build
?似乎这可能会删除由Account.new创建的所有内容。此外,您是否需要在您的帐户模型中使用户\u属性
可访问?@Beer。create中需要使用@account.users.build
来在新表单上显示用户字段,否则您得到的只是帐户字段-据我所知,这基本上类似于调用user.new
,但它是通过帐户链接的。不确定users\u属性
——我的诀窍是它们在参数中可见,但嵌套在表单字段中,因此不可用。我对这一点有点陌生,如何在帐户模型中访问它们?您当然不需要第二个用户。在create
失败的基础上构建。在new
中确实需要一个,因为它会生成一个新用户来填充表单。但是在create
失败后,@account.users
应该已经包含通过参数传入的新用户。您应该记录@account的内容。创建后用户
无法查看它是否包含记录。如果是这样的话(应该是这样),我的第一个疑点就是简单形式(只是因为我不熟悉它)。顺便说一句,为什么表单在提交时失败?我没有看到任何验证。@numbers1311407添加了用户。在create
失败时生成,因为我们只是呈现new
视图,而不是实际运行new
控制器操作。没有users.build
用户字段不会显示在表单上-我通过测试检查了这一点,它似乎是正确的。我已经查看了带有rails脚注的参数,这些参数包含了为帐户和用户模型发布的所有信息。我会检查一下删除简单表单,看看它是否会有所不同。我已经从上面发布的模型中删除了一些验证,以减少问题的大小。我向您保证,第二个用户.build
是不必要的,也是错误的,除非您真的想在每次创建失败时构建另一个新用户<代码>接受\u嵌套的\u属性\u for:users
将向帐户添加一个users\u attributes=
writer来更新帐户的用户,参数将在参数中传递。发生了两件事中的一件:要么没有在记录上设置用户(通过将其记录在控制器中进行测试),要么表单没有在用户上迭代。这会起作用,但实际上您所做的是绕过接受的嵌套属性并手动处理关联生成。检查我的新答案,了解你的o的真正问题是什么
WARNING: Can't mass-assign protected attributes: users_attributes