【问题标题】:Rails 4: Params with a hashRails 4:带有哈希的参数
【发布时间】:2016-09-27 16:12:55
【问题描述】:

我有一个form,它在参数中将一个数组传递给我的控制器,它不断导致ActiveModel::ForbiddenAttributesError。我的create 函数调用另一个函数来修复这些数组参数并将这些部分组合成一个字符串,但我认为现在为时已晚。

参数

{  "remote"=>
      {  "name"=>"",
         "start_date"=>"9/27/2016",
         "email"=>"",
         "allergies"=>["Peanuts", "Soy Protein", "Dairy", ""],
      }
}

控制器

def create

    new_params = fix_params(params, ["allergies"])
    remote_params = new_params["remote"]
    @remote = Remote.new(remote_params)

    respond_to do |format|
        if @remote.save
            format.html { redirect_to root_path, notice: 'Remote was successfully created.' }
            format.json { render :show, status: :created, location: @remote }
        else
            format.html { render :new }
            format.json { render json: @remote.errors, status: :unprocessable_entity }
        end
    end
end

def fix_params(params, fields)
        fields.each do |field|
            to_change = params[:remote][field]
            new_param = to_change.join(", ").strip()
            params[:remote][field] = new_param || ""
        end
    return params
end

也许有更好的方法来传递这些变量?

【问题讨论】:

  • ActiveModel 错误表明模型中的某些东西阻止了这一点。你也可以发一下吗?另外,你为什么需要fix_params 方法,你想达到什么目的?毫无疑问,还有一种更随意的方式。
  • 你是对的,这是由于模型,我希望我有不同的方式来完成我在fix_params 中所做的事情。该函数基本上采用一个参数数组并将它们组合成一个字符串
  • 有更好的方法来做到这一点,在你的模型中,定义一个自定义设置器 def allergies=(value) do self[:allergies] = value.is_a?(Array) ? value.join(', ').strip :值结束。模型将在您设置它的任何时候修复该值。
  • Allergies 可能是对象上的has_many 关系,或者您可以序列化该列并且您不需要将其设为字符串。 api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/…

标签: ruby-on-rails forms ruby-on-rails-4


【解决方案1】:

发生错误是因为有unpermitted parameters,因为我从未明确说明参数中会传递array

我修改了我的强参数以包含params.require(:remote).permit(:name, :start_date, :email, :allergies => [])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 2016-10-25
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2020-07-19
    • 2017-08-08
    相关资源
    最近更新 更多