0

我是相当新的轨道,建立我的第一个应用程序。我正在运行rails 4 w/bootstrap 3.我试图让一个复杂的表单工作。我有两个型号:accep_nested_attributes_for工作不正常

class Employee < ActiveRecord::Base 
    belongs_to :company 
    belongs_to :user, :through => :company 
    has_one :position 
    accepts_nested_attributes_for :position 
end 

class Position < ActiveRecord::Base 
    belongs_to :employees 
    accepts_nested_attributes_for :employees 
end 

我有一个表格,用户可以创建一个新的职位(职位模型),并选择员工(雇员模型)位置将被应用到。基本上它是一个将字段添加到2个不同数据库表(Position和Employee)的单一表单。

这是我的看法:

<%= simple_form_for(@position) do |f| %> 
    <%= f.error_notification %> 
    <div class="form-inputs"> 
    <%= f.input :job_title %> 
    <%= f.input :job_description %> 
    </div> 
    <%= f.fields_for :Employee do |f| %> 
     <%= f.input :employee_title, label: "Apply to:", collection: Employee.all, label_method: :first_name, as: :check_boxes %> 
    <% end %> 
    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

下面是控制器:

class PositionsController < ApplicationController 
    before_action :set_position, only: [:show, :edit, :update, :destroy] 

    # GET /positions 
    # GET /positions.json 
    def index 
    @positions = Position.all 
    end 

    # GET /positions/1 
    # GET /positions/1.json 
    def show 
    end 

    # GET /positions/new 
    def new 
    @position = Position.new 
    end 

    # GET /positions/1/edit 
    def edit 
    end 

    # POST /positions 
    # POST /positions.json 
    def create 
    @position = Position.new(position_params) 

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

    # PATCH/PUT /positions/1 
    # PATCH/PUT /positions/1.json 
    def update 
    respond_to do |format| 
     if @position.update(position_params) 
     format.html { redirect_to @position, notice: 'position was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @position.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /positions/1 
    # DELETE /positions/1.json 
    def destroy 
    @position.destroy 
    respond_to do |format| 
     format.html { redirect_to positions_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_position 
     @position = Position.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def position_params 
     params.require(:position).permit(:position_title, :position_description, :position_create_date) 
    end 
end 

class EmployeesController < ApplicationController 
    # encoding: UTF-8 
    before_action :set_employee, only: [:show, :edit, :update, :destroy] 

    # GET /employees 
    # GET /employees.json 
    def index 
    @employees = Employee.all 
    end 

    # GET /employees/1 
    # GET /employees/1.json 
    def show 
    end 

    # GET /employees/new 
    def new 
    @employee = Employee.new 
    end 

    # GET /employees/1/edit 
    def edit 
    end 

    # POST /employees 
    # POST /employees.json 
    def create 
    @employee = Employee.new(employee_params) 

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

    # PATCH/PUT /employees/1 
    # PATCH/PUT /employees/1.json 
    def update 
    respond_to do |format| 
     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 

    # DELETE /employees/1 
    # DELETE /employees/1.json 
    def destroy 
    @employee.destroy 
    respond_to do |format| 
     format.html { redirect_to employees_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_employee 
     @employee = Employee.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def employee_params 
     params.require(:employee).permit(:first_name, :last_name, :employee_title) 
    end 
end 

我现在面临的问题是我得到的形式完美呈现,但是当我提出它,只有记录属于位置模型的字段。 :employee_title保持空白。有什么建议是什么问题?

谢谢!

+0

把你的控制器代码也一样,如果您使用的不是强大的参数,确保你让所有的参数 –

+0

也许这件事情与控制器。我已经添加了两个控制器。 –

回答

0

点太多,以适应评论:

belongs_to :employees应为单数:belongs_to :employee

fields_for应该是这样的(区分FF从父窗体):

<%= f.fields_for :Employee do |ff| %> 
<%= ff.input :employee_title, label: "Apply to:", collection: Employee.all, 
          label_method: :first_name, as: :check_boxes %> 
<% end %> 

如果它不起作用,请提供您的控制器,我会更新我的答案。

编辑:

看到你的控制器后,它似乎最有可能的情况下unpermitted params

position_controller.rb添加员工PARAMS到位置PARAMS

def position_params 
    params.require(:position).permit(:position_title, :position_description, :position_create_date, employees_attributes: [:first_name, :last_name, :employee_title]) 
end 
+0

雅,不幸的是,没有奏效。我已经添加了两个控制器。谢谢 –

+0

看到您的控制器后更新。 – Kasperi

+0

由于某种原因,这种情况不起作用。任何其他建议? –