我有一个部门模型,课程模型和强制模型。 每个部门都有一些必修课程,因此我使用强制模型在课程和部门模型之间进行映射。
我希望能够通过选择课程和部门的名称而不是他们的ID来创建“强制”关系。
我想我会创建2个实例变量@departments(Department.all)和@courses(Course.all),在视图中我会将它们显示为下拉菜单,因此您选择1个部门,1个课程并创建强制关系。事实证明,它并不像我希望的那样简单。我不明白我应该如何使用collection_select
辅助方法。我已阅读文档,但我不理解。
所以我的部门模型是
class Department < ActiveRecord::Base
attr_accessible :industry_name, :name
has_many :employees
has_many :mandatories
has_many :courses, :through => :mandatories
end
课程模型
class Course < ActiveRecord::Base
attr_accessible :name
has_many :registrations
has_many :mandatories
has_many :employees, :through => :registrations
has_many :departments, :through => :mandatories
end
强制模式
class Mandatory < ActiveRecord::Base
attr_accessible :course_id, :department_id
belongs_to :course
belongs_to :department
end
我从文档中获得的语法是<%= collection_select(:person, :city_id, City.all, :id, :name) %>
根本不明白这一点。
EDIT ::
所以,继承人是我目前的看法。我还没有collection_select
。现在要在部门和课程之间建立一种关系,我需要输入他们不想做的ID。我希望下载部门名称和课程名称。
这是强制控制器的_form.html
<%= form_for(@mandatory) do |f| %>
<% if @mandatory.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@mandatory.errors.count, "error") %> prohibited this mandatory from being saved:</h2>
<ul>
<% @mandatory.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :department_id %><br />
<%= f.number_field :department_id %>
</div>
<div class="field">
<%= f.label :course_id %><br />
<%= f.number_field :course_id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
这是Mandatory Controller
def create
@mandatory = Mandatory.new(params[:mandatory])
@courses = Course.all
@departments =Department.all
respond_to do |format|
if @mandatory.save
format.html { redirect_to @mandatory, notice: 'Mandatory was successfully created.' }
format.json { render json: @mandatory, status: :created, location: @mandatory }
else
format.html { render action: "new" }
format.json { render json: @mandatory.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:1)
您需要在以下形式的上下文中使用它:
<% form_for @mandatory do |f| %>
<div class="field">
<%= f.label :course_id %><br />
<%= f.collection_select(:course_id, Course.all, :id, :name) %>
</div>
<%= f.submit %>
<% end %>
答案 1 :(得分:1)
<%= collection_select(:person, :city_id, City.all, :id, :name) %>
让我们看一下这些部分:
:person
是包含集合中一个项目的模型的名称。
:city_id
是模型中包含集合中项目的字段的名称。
City.all
是集合中的项目列表。如果您在控制器(@cities
)中执行了数据库请求,则可以是实例变量(@cities = City.all
)。您也可以只获取记录的一部分,如果这是您在集合中所需的全部内容(@cities = City.where("state = ?", ["NY", "SC", "NE"])
)
:id
和:name
是City
对象中的字段,如果选择列表,则在每一行中使用。 :id
是值,:name
是下拉列表中每个选项的文本。
生成的HTML应该是
<select name="person[city_id]">
<option value="1">New York</option>
<option value="3">Rome</option>
<option value="4">Charleston</option>
<option value="17">Omaha</option>
</select>
编辑:当我不看时,选择中的'id'似乎已经退出,所以我已将其删除。