Rails 4,强参数,属于关联模型的字段上的未允许参数

时间:2015-06-25 20:08:01

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

这是我第一次尝试使用与Rails 4关联的模型,由于某些原因,由于“未经许可的参数”错误,我无法获得POST参数。我试图以不同的方式允许相关字段,但没有成功。

基本上,我有一个关联人员的收养申请。

if(!@$_SESSION['login'])
{
  header("location: logingpage.php");
  exit();
}

class AdoptionRequest < ActiveRecord::Base
  has_one :person

  accepts_nested_attributes_for :person
end

以下是adoption_requests_controller.rb的相关章节:

class Person < ActiveRecord::Base
    belongs_to :adoption_request
end

视图中的表单使用rails-bootstrap-forms生成:

def create
    @adoption_request = AdoptionRequest.new(adoption_request_params)

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

private
    def adoption_request_params
        params.require(:adoption_request).permit(person_attributes: [:first_name, :last_name])
    end

以下是为第一个名称字段生成的HTML示例:

= bootstrap_form_for @adoption_request do |f|
    = f.fields_for @adoption_request.person do |owner_fields|
        = owner_fields.text_field :first_name
        = owner_fields.text_field :last_name
    = f.submit

现在,当我提交以下POST有效负载时:

 <input class="form-control" id="adoption_request_person_first_name" name="adoption_request[person][first_name]" type="text">

已创建采用请求,但相关人员未创建。这似乎正在发生,因为强参数不允许人参数通过。例如,我在rails控制台输出中看到了这一点:

{"utf8"=>"✓", "authenticity_token"=>"kE1Q222VzXRsuLnhiO0X3mijW1TGTWSAOVgVDz/rxsE=", "adoption_request"=>{"person"=>{"first_name"=>"John", "last_name"=>"Smith"}}, "commit"=>"Create Adoption request"}

根据强参数文档,此配置应该有效,但我也尝试过:

Unpermitted parameters: person

导致相同的错误(“未经许可的参数:人”)和

params.require(:adoption_request).permit(:person, person_attributes: [:first_name, :last_name])

允许参数通过,但这不是一个可接受的解决方案,因为它否定了使用强参数的整个目的。

我做错了什么?

这是我的Gemfile,以防它有用:

params.require(:adoption_request).permit!

应用程序本身比这更复杂。我简化了它来说明问题。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您需要更改此行

= f.fields_for @adoption_request.person do |owner_fields| 

= f.fields_for :person do |owner_fields|

答案 1 :(得分:0)

我只想尝试在保存时构建Person对象。将名字和姓氏作为隐藏字段传递。

否则我会给strong parameters一个读数。

if @adoption_request.save
@adoption_request.persons.build(first_name: @first_name, last_name: @last_name)