在RoR中编写嵌套表单

时间:2014-07-04 08:15:15

标签: ruby-on-rails ruby forms

我正在尝试在ROR中编写嵌套表单。 我有两个表EmployeeEmployeeInfo,两个表都有一个名为employeeID的列 这些表与此密钥相关联。 我想要做的是创建一个带有一些输入字段的表单,这些字段应该将值更新到两个表中。

例如我想要一个可以创建或更新名为employee_nameageaddresscityemployee_nameage字段的表单表Employee中存在{}} cityaddress表示{}} 那么我应该如何编写表单标签来执行此操作。 如果问题是一个大错,请抱歉。我真的很擅长这个。请帮忙

3 个答案:

答案 0 :(得分:2)

在rails 4中你需要使用

accepts_nested_attributes_for :employeeinfo
员工模型中的

员工 emplyeeinfo 的关系为has_one

形式:

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

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

  <div class="field">
    <%= f.label :employee_name %><br>
    <%= f.text_field :employee_name %>
  </div>
  <div class="field">
    <%= f.label :age %><br>
    <%= f.text_field :age %>
  </div>

  <%= f.fields_for :employeeinfo do |s| %>
    <%= s.label :address %><br>
    <%= s.text_field :address %>
  <% end %>

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

请根据您的型号名称编辑表单对象。

答案 1 :(得分:2)

扩展 @ emu的回答

模型设置

#employee.rb
Class Employee < ActiveRecord::Base
  has_one :employe_info
  accepts_nested_attributes_for :employee_info
end

#employee_info.rb
Class EmployeeInfo < ActiveRecord::Base
  belongs_to :employee
end

<强>控制器

Class EmployeesController < ApplicationController

   def new
      @employee = Employee.new
      @employee.build_employee_info
   end

   def create
     @employee = Employee.new(employee_params)

     if @employee.save
     redirect_to @employee
     else
     render 'new'
     end
   end

   private

   def employee_params
     params.require(:employee).permit(:employee_name, :age, employee_info_attributes: [:id, :city,:address])
   end
 end

答案 2 :(得分:1)

Foriegn Key

首先是&#34;连接器&#34;您引用的密钥称为foreign_key

这是一个标准relational database功能,允许您加入&#34;两个或多个数据库以及单个参考点。每当您使用associations in Rails时,您基本上必须使用foreign_key

加入两个数据表
  

两个表都有一个名为employeeID的列

您的employee_infos表只需要包含foreign_key employee_id

#app/models/employee.rb
Class Employee < ActiveRecord::Base
   has_one :employee_info #-> foreign key = "employee_id"
   accepts_nested_attributes_for :employee_info
end

#app/models/employee_info.rb
Class EmployeeInfo < ActiveRecord::Base
   belongs_to :employee
end

<强>表单

Emu所述,您需要使用accepts_nested_attributes_for

这允许您从父母传递数据&#34;模型到儿童模型,正是您目前设置的。不同之处在于您必须确保正确设置它。

无论您的想法如何,您都需要这样做。你提到自己,你对Rails很新;这意味着您的异议可能基于您当前的数据库设置。这可能不正确

你应该使用emu&amp; Pavan解决此问题的答案:)