2014-07-04 20 views
0

我正在处理一个嵌套的属性表单。Rails 4.0.0中的ActiveModel禁止错误

这是两个模型.. 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' 

有什么不对?请帮助

+0

请问您可以发布您的控制器吗? – Emu

+1

你可以发布你的控制器的'employee_params'方法吗? – Pavan

回答

2

employees_controller

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

添加term_date & HIRE_DATEemployee_params方法类似上面的代码。

希望它解决了这个问题。

P.S.并请阅读主题在轨道上创建应用程序之前,“Rails的强大参数”> = 4

+0

好..这种情况下更新..但是在创建一个新的领域即时通讯使用相同的形式ñ第二种形式是不呈现任何想法? –

3

轨道4具有从strong_parameters功能

所以你可以使用

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

,或者你可以做以下方式

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

更新现在工作正常..但即时通讯使用相同的形式创建一个新的领域.. 但在视图第二种形式(employee_info形式)不geting呈现..任何理由? –

+0

你可以看看development.log中的错误吗?你得到了什么错误 –

+0

谢谢你的努力。已经完全没有错误。有些东西没有被渲染到我的视图:)现在已经存在 –