params.require()permit无法按预期工作



我有这个控制器

class PeopleController < ApplicationController
    def new
        @person = Person.new
        @person.phones.new
    end
    # this is the action that gets called by the form
    def create
        render text: person_params.inspect
#       @person = Person.new(person_params)
#       @person.save
#       redirect_to people_path
    end
    def index
        @person = Person.all
    end
private
    def person_params
        params.require(:person).permit(:name, phones_attributes: [ :id, :phone_number ])
    end
end

和这个视图

<%= form_for :person, url: people_path do |f| %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <%= f.fields_for :phones do |f_phone| %>
    <div class="field">
      <p>
        <%= f_phone.label :phone_number %><br />
        <%= f_phone.text_field :phone_number %>
      </p>
    </div>
    <% end %>
  <p>
    <%= f.submit %>
  </p>
<% end %>

当我填写两个表单字段并点击"Save Person"时,我只得到{"name"=>"foo"}——电话号码似乎消失了。

然而,当我将phones_attributes更改为phones时,我得到了{"name"=>"foo", "phones"=>{"phone_number"=>"123"}}(但是这会导致创建函数出现问题。

这里怎么了?

请注意,这个问题与以下问题密切相关:accepts_nested_attributes_for:我做错了什么以及这篇帖子:https://groups.google.com/forum/#!topic/rubyonrails talk/4RF_CFChua0

您没有在控制器中定义@phones:

 def new
    @person = Person.new
    @phones = @person.phones.new
 end

终于发现了问题。在视图中应该有

<%= form_for @person, url: people_path do |f| %>

代替

<%= form_for :person, url: people_path do |f| %>

@phron已经说过了:accepts_nested_attributes_for:我做错了什么

最新更新