Rails collection_select很多很多

时间:2012-11-09 02:08:33

标签: ruby-on-rails ruby-on-rails-3.2

我有一个带有两个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的事情是我希望能够展示的课程的名称,当然这不是一种方法,但我不知道为什么我得到错误,我希望能够显示的名称第一次收集实地课程的类似课程...

感谢您的帮助!

3 个答案:

答案 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" %>