我有一个带有两个collection_select字段的表单,第一个是简单的一个,它只是获取一个名为courses的模型,它显示了课程名称,当然还返回了所选课程的id,第二个是一个我遇到了问题,它是一个课程可能有类似课程的集合选择。
课程模型:
class Course < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :slugged
attr_accessible :code, :credits, :name, :description, :active
has_many :similars, dependent: :destroy
has_many :similar_courses, through: :similars, source: :similar
end
类似的模型:
class Similar < ActiveRecord::Base
attr_accessible :course_id, :similar_id
belongs_to :course
belongs_to :similar, class_name: "Course"
validates :similar_id, presence: true
validates :course_id, presence: true
end
这是认证模型,这个模型的事情是,如果想要转移课程和类似的东西,必须批准或拒绝课程:
class Homologation < ActiveRecord::Base
attr_accessible :homologate_by, :homologate_course, :student_id
belongs_to :user
end
这是我遇到问题的表格:
<%= form_for(@homologation) do |f| %>
<%= render 'shared/error_messages', object: @homologation %>
<%= f.label :homologate_course %>
<%= f.collection_select :homologate_course, Course.find(:all), :id, :name, :prompt => "Select a Course" %>
<%= f.label :homologate_by %>
<%= f.collection_select :homologate_by, Similar.find(:all), :similar_id, :name, :prompt => "Select a Similar Course" %>
<div class="form-actions">
<%= f.submit "Create Homologation", class: "btn btn-large btn-primary" %>
</div>
<% end %>
</div>
我收到以下错误
http://dpaste.com/hold/827744/
Bartolleti的事情是我希望能够展示的课程的名称,当然这不是一种方法,但我不知道为什么我得到错误,我希望能够显示的名称第一次收集实地课程的类似课程...感谢您的帮助!
答案 0 :(得分:0)
首先,我建议将“类似”逻辑从表单中删除。那么在控制器中你的find.all就可以在你的视图中用作实例变量@similar_list左右。
其次,请在此处查看表单的options_from_collection_for_select:
http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select
请告诉我这是否对您有所帮助。
答案 1 :(得分:0)
问题在于,
<%= f.collection_select :homologate_by, Similar.find(:all), :similar_id, :name, :prompt => "Select a Similar Course" %>
In this line :name is trying to find a record from course and the course name.
因此,最好在控制器中编写Similar.find(:all)。
答案 2 :(得分:0)
来自the doc of collection_select:
collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})
然后使用您的代码Course.find(Similar.find_by_id(:similar_id)).name
作为text_method
,这就是您收到此错误消息的原因。
一种解决方案可能是在Similar model
上添加一个方法来获取类似的课程名称:
def similar_name
similar.name
end
然后您可以将其用作text_method
中的collection_select
:
<%= f.collection_select :homologate_by, Similar.find(:all), :similar_id, :similar_name, :prompt => "Select a Similar Course" %>