我有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中的对象?
答案 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 %>