【问题标题】:How to add default values to nested items in a Rails controller?如何为 Rails 控制器中的嵌套项添加默认值?
【发布时间】:2020-04-29 15:37:18
【问题描述】:

在我的 Rails 6 应用程序的注册表单中,可以创建一个带有嵌套 UserAccount

class AccountsController < ApplicationController

  def new
    @account = Account.new
    @account.users.build(
      :owner => true,
      :language => "FR"
    )
  end

  def create
    @account = Account.new(account_params)
    if @account.save
      redirect_to root_url, :notice => "Account created."
    else
      render :new
    end
  end

private

  def account_params
    safe_attributes = [
      :name,
      :users_attributes => [:first_name, :last_name, :email, :password, :owner, :language]
    ]
    params.require(:account).permit(*safe_attributes)
  end

end

在此处为新的user 定义默认值的最佳方法是什么?

现在,我在我的注册表单中使用hidden_fields 作为默认值,从而使它们公开可用。这当然不是我想要的,因为它非常不安全。

有没有更好的方法来解决这个问题?

我知道有 Rails' with_defaults 方法,但到目前为止我无法让它在嵌套项目上工作。

【问题讨论】:

  • 请详细说明您要设置什么样的默认值以及默认值是否始终相同或它们是否取决于关联的帐户。是否可以在数据库级别配置默认值?
  • @spickermann,默认值视情况而定。 user 也可以在另一个控制器中创建,然后 owner 属性应该是 false。这就是我猜我无法在数据库级别设置默认值的原因。

标签: ruby-on-rails ruby activerecord strong-parameters


【解决方案1】:

尝试:

account_params[:users_attributes] = account_params[:users_attributes].with_defaults({ first_name: 'John', last_name: 'Smith'})

在创建动作的第一行

【讨论】:

  • 谢谢,但我无法让它工作。如果我包含该行,它不会改变任何东西。 Rails 似乎只是忽略了它。创建新记录后,数据库中的属性为空。
猜你喜欢
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多