【问题标题】:Why am I still getting the error "Can't mass-assign protected attributes: contacts"为什么我仍然收到错误“无法批量分配受保护的属性:联系人”
【发布时间】:2012-07-13 17:48:59
【问题描述】:

当我尝试在邮件字段留空的情况下创建新的女孩记录时,我收到此错误。
邮件字段是嵌套的。

当它不输入时,我只希望它只制作女孩记录而不创建联系人记录。
当它充满了一些东西时,我希望它同时记录 Girl 和 Contact 记录。
当它更新时,我希望它做同样的事情。
我怎样才能做到这一点???我的代码有什么问题?

我的观点

<%= form_for(@girl) do |f| %>
  <% if @girl.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@girl.errors.count, "error") %> prohibited this girl from being saved:</h2>

      <ul>
      <% @girl.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name_en %><br />
    <%= f.text_field :name_en %>
  </div>
  <div class="field">
    <%= f.label :name_ja %><br />
    <%= f.text_field :name_ja %>
  </div>
  <div class="field">
    <%= f.label :gender_id %><br />
    <%= f.number_field :gender_id %>
  </div>
  <div class="field">
    <%= f.label :job_type_id %><br />
    <%= f.number_field :job_type_id %>
  </div>
  <div class="field">
    <%= f.label :age %><br />
    <%= f.number_field :age %>
  </div>
  <div class="field">
    <%= f.fields_for :contacts do |contact| %>
    <%= f.label :mail %><br />
    <%= contact.text_field :mail %>
    <% end %>
  </div>

  <div class="field">
    <%= f.label :photo %><br />
    <%= f.file_field :photo %>
  </div>

    <div class="field">
      <%= f.label :tag_list, 'tag' %><br />
      <%= f.text_field :tag_list %>
    </div> 

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我的控制器

  def new

    @girl = Girl.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @girl }
    end
  end


  def create

    @girl = Girl.new(params[:girl])

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


  def update

    @girl = Girl.find(params[:id])

    respond_to do |format|
      if @girl.update_attributes(params[:girl])
        format.html { redirect_to @girl, notice: 'Girl was successfully updated.' }
        format.json { head :ok }
      else
        format.html { render action: "edit" }
        format.json { render json: @girl.errors, status: :unprocessable_entity }
      end
    end
  end

女模特

class Girl < ActiveRecord::Base
  has_many :users
  has_one :contact
  accepts_nested_attributes_for :contact
  attr_accessible :id, :name_en, :name_ja, :gender_id, :job_type_id, :age, :contact_attributes, :photo, :tag_list

  searchable do 
    text :name_en, :name_ja
    text :contact do 
      contact.mail 
    end 
  end

    has_attached_file :photo,
     :styles => {
       :thumb=> "100x100>",
       :small  => "400x400>" } 

  acts_as_taggable_on :tags
  acts_as_commentable


end

联系型号

class Contact < ActiveRecord::Base
  belongs_to :girl, :class_name => "Girl"
  accepts_nested_attributes_for :girl
  attr_accessible :mail

end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 associations nested-forms


    【解决方案1】:

    这是最新版本的 rails 可能会出现的问题,因为他们已对其进行了修补。您可以在配置中更改它。详情请见http://weblog.rubyonrails.org/2012/3/30/ann-rails-3-2-3-has-been-released/

    当您的表单中应该使用单数时,您似乎使用了复数。

     <div class="field">
        <%= f.fields_for :contacts do |contact| %>
        <%= f.label :mail %><br />
        <%= contact.text_field :mail %>
        <% end %>
     </div>
    

    应该是:

     <div class="field">
        <%= f.fields_for :contact do |contact| %>
        <%= f.label :mail %><br />
        <%= contact.text_field :mail %>
        <% end %>
     </div>
    

    您需要将以下内容添加到新操作的控制器中:

    @girl.build_contact
    

    【讨论】:

    • 谢谢!!我刚刚在 create 方法中的 if @girl.save 前面添加了 @girl.contacts = params[:girl][:contacts] 。但它仍然说同样的错误。我还缺少什么??
    • 您需要从参数中删除联系人部分。 params[:girl].delete(:contacts) 在您的 update_attributes 通话之前。
    • 如果我把它设为单数作为联系人,消息输入框就消失了。它消失了
    • 如果可以,能否请您复制或编辑我的代码并修改??
    • 谢谢。但现在邮件输入不见了。它消失了。是因为它是空的吗?当我尝试创建新记录时会出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多