Rails 4.0.0中的ActiveModel禁止错误

时间:2014-07-04 09:53:46

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

我正在处理嵌套的属性表单。

这些是两个型号.. Employee.rb

class Employee < ActiveRecord::Base
  has_one :employee_info, :primary_key => :employeeID, foreign_key: :employeeID
  accepts_nested_attributes_for :employee_info
end

EmployeeInfo.rb

class EmployeeInfo < ActiveRecord::Base
  belongs_to :employee, primary_key: :employeeID, foreign_key: :employeeID
  validates_uniqueness_of :employeeID
end

我的表单在_form.html.rb

<%= form_for @employee, html: {class: "form form-horizontal validate-form", novalidate: "novalidate"} do |f| %>
                    <% if @employee.errors.any? %>
                        <div id="error_explanation">
                            <div class="alert alert-danger alert-dismissable"> 
                                <a class="close" data-dismiss="alert" href="#">×</a>
                                <h2><%= pluralize(@employee.errors.count, "error") %> prohibited this shop from being saved:</h2>
                                <ul>
                                    <% @employee.errors.full_messages.each do |msg| %>
                                        <li><%= msg %></li>
                                    <% end %>
                                </ul>
                            </div>
                        </div>
                    <% end %>
                    <div class='form-group'>
                        <%= f.label :employeeID, class: 'col-md-2 control-label' %>
                        <div class='col-md-5'>
                            <%= f.text_field :employeeID,  {class: 'form-control'} %>
                        </div>
                    </div>
                    <div class='form-group'>
                        <%= f.label :employee_name, class: 'col-md-2 control-label' %>
                        <div class='col-md-5'>
                            <%= f.text_field :employee_name, class: 'form-control' %>
                        </div>
                    </div>

                    <%= f.fields_for :employee_info do |ff| %>
                        <div class='form-group'>
                            <%= ff.label :hired, class: 'col-md-2 control-label' %>
                            <div class='col-md-5'>
                                <%= ff.text_field :hire_date, class: 'form-control' %>
                            </div>
                        </div>
                        <div class='form-group'>
                            <%= ff.label :terminated, class: 'col-md-2 control-label' %>
                            <div class='col-md-5'>
                                <%= ff.text_field :term_date, class: 'form-control' %>
                            </div>
                        </div>
                    <% end %>


                    <div class='form-actions form-actions-padding-sm'>
                        <div class='row'>
                            <div class='col-md-10 col-md-offset-2'><i class='icon-save custom-icon'></i>
                                <% if params[:action] == "new" %>
                                    <%= f.submit "Create", class: 'btn btn-primary custom-button' %>
                                <% else %>
                                    <%= f.submit "Update", class: 'btn btn-primary custom-button' %>
                                <% end %>
                                <%= link_to 'Cancel', shops_path, class: 'btn' %>
                            </div> 
                        </div> 
                    </div>
                <% end %>

和控制器中的更新方法

def update
    respond_to do |format|
      p "------------------------------"
      p employee_params
      if @employee.update(employee_params)
        format.html { redirect_to @employee, notice: 'Employee was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @employee.errors, status: :unprocessable_entity }
      end
    end
  end

控制台中p employee_params的输出是

{"employeeID"=>"103", "employee_name"=>"James Michule", "employee_info_attributes"=>{"hire_date"=>"1996-03-12 11:30:00 UTC", "term_date"=>"1996-03-12 11:30:00 UTC", "hourly_rate"=>"7.4", "address"=>"108 E. Jay", "phone_number1"=>"", "phone_number2"=>"", "zipcode"=>"65721", "state"=>"MO", "city"=>"Ozark", "id"=>"30"}}

当我尝试更新时,我收到错误.. 错误:

ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
  app/controllers/employees_controller.rb:56:in `block in update'
  app/controllers/employees_controller.rb:53:in `update'

出了什么问题。请帮忙

2 个答案:

答案 0 :(得分:3)

Rails 4具有strong_parameters

的功能

所以你可以使用

@employee.update_attributes(params[:employee], permit[:employee_attribute]

或者您可以按照以下方式进行操作

@employee.update_attributes(params[:employee].permit(:employeeID))

答案 1 :(得分:2)

您的 employees_controller

private
  def employee_params
    params.require(:employee).permit(:term_date, :hire_date)
  end

添加 term_date &amp; employee_params方法中的 hire_date ,如上面的代码所示。

希望它能解决问题。

P.S。请阅读主题&#34; Rails强参数&#34;在rails&gt; = 4

上创建应用之前