为什么我的ActionController :: Parameters错误得到未定义的方法“ deep_merge”?

时间:2018-07-06 09:17:41

标签: ruby-on-rails ruby actioncontroller

在我的Rails 5应用程序中,我试图在控制器中执行此操作:

  def create
    company_params = params.require(:company).permit(
      :name,
      :email,
      :people_attributes => [
        :first_name,
        :last_name
      ]
    ).deep_merge(
      :creator_id => current_user.id,
      :people_attributes => [
        :creator_id => current_user.id
      ]
    )
    @company = current_account.companies.build(company_params)
    if @company.save
      flash[:success] = "Company created."
      redirect_to companies_path
    else
      render :new
    end
  end

由于某种原因,我遇到此错误:

  

ActionController :: Parameters:0x007fa24c39cfb0的未定义方法'deep_merge'

我在这里想念什么?

3 个答案:

答案 0 :(得分:3)

  

我在这里想念什么?

paramsActionController::Parameters的一个实例。它不是哈希。不过,它具有 some 合并方法。

params.methods.grep(/merge/)
=> [:reverse_merge!, :reverse_merge, :merge!, :merge]

如果您想要deep_merge,请以某种方式将参数转换为哈希。

答案 1 :(得分:0)

尽管在请求周期中修改参数不是一个好习惯,但是如果您要这样做,总是有一个.to_hash.deep_merge选项供您从参数实例中检索散列。

答案 2 :(得分:0)

好的,我无法deep_merge上班,所以我最终这样做了:

  def create
    company_params = params.require(:company).permit(
      :name, 
      :email,
      :people_attributes => [
        :first_name,
        :last_name
      ]
    )
    @company = current_account.companies.build(company_params)
    @company.creator = current_user
    @person = @company.people.last
    @person.account = current_account
    @person.creator = current_user
    if @company.save
      flash[:success] = "Company created."
      redirect_to companies_path
    else
      render :new
    end
  end

不确定这是好方法还是坏方法。反馈表示赞赏!