Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在使用accepts_nested_attributes_时,在失败的创建操作上将参数传递给新模板_Ruby On Rails_Ruby On Rails 3.1 - Fatal编程技术网

Ruby on rails 在使用accepts_nested_attributes_时,在失败的创建操作上将参数传递给新模板

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

我可能只是错过了一些简单的东西,但我相对缺乏经验,所以很有可能。我已经广泛地寻找解决方案,但没有成功

我正在使用函数的字段\u来使用函数的接受\u嵌套属性\u来构建嵌套表单。如果表单上的提交失败,则参数仅传递给父模型的新模板的呈现。如何传递子模型的嵌套参数,以便先前填写的字段保持填充状态。请注意,我使用的是simple_form和HAML,但我认为这不会对解决方案产生太大影响

我的模型:

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