未定义的方法`first'Mongoid

时间:2012-02-05 14:28:28

标签: ruby-on-rails mongoid has-and-belongs-to-many

我有2个型号:

board.rb

class Board
 has_and_belongs_to_many :posts, :autosave => true
end

post.rb

class Post
 has_and_belongs_to_many :boards
end

在我的 posts_controller.rb

def create
 @post = current_user.posts.new(params[:post])
 @post.save
end

在我的观看帖子中,我有一个带有collection_select字段的表单:

<%= form_for(@post) do |f| %>
 <%= f.submit %>
<%= f.collection_select :board_ids, Board.where(:user_id => current_user.id), :id, :name%>
<% end %>

我得到类型关系 has_and_belongs_to_many 下一个错误:

对于BSON :: ObjectId('4f2e61ce1d41c8412a000215'),

未定义的方法`first':BSON :: ObjectId

:board_ids是对象Post中的数组类型 board_ids:[]

如何在此数组中保存字段collection_select中的对象?

2 个答案:

答案 0 :(得分:1)

如果要使用选择,则需要指定html选项“multiple”才能提交选项数组。

<select multiple="muliple"> ...

我的工作Rails表单(使用simple_form)如下所示:

<%= simple_form_for @exercise, :html => { :multipart => true } do |f| %>
   <%= f.input_field :category_ids, :multiple => "multiple", :as => :grouped_select, :collection => CategoryGroup.all, :group_method => :categories %>
<% end %>

答案 1 :(得分:0)

这里的问题似乎是您使用下拉列表映射到多值字段(board_ids)。因此,当mongoid期待一个数组时,你的应用程序正试图将board_ids字段设置为单个值(BSON :: ObjectId)。

如果Post可以与许多Boards相关联(并且假设您没有为给定用户提供大量的板)那么可能更好的方法是使用一组复选框而不是单一下拉列表。

<% Board.where(:user_id => current_user.id).each do |board| %>
  <%= check_box_tag 'post[board_ids][]', board.id, @post.board_ids.include?(board.id) %>
  <%= board.name %>
<% end %>