【发布时间】:2017-09-20 05:15:20
【问题描述】:
该关联运行良好,因为我可以在 IRB 上使用它。我也可以编辑现有书籍来添加标签,但我不能同时创建和分配标签(“标签无效”验证错误)。我想这是一个表单/控制器问题,我想我必须 .build 它,但我不知道如何。
## Tag model (:tags)
belongs_to :genre
belongs_to :taggable, polymorphic: true
## Genre model (:genres)
has_many :tags
has_many :taggables, through: :tags
## Serie model (:series)
has_many :tags, as: :taggable, dependent: :destroy
has_many :genres, through: :tags
## Book model (:books)
has_many :tags, as: :taggable, dependent: :destroy
has_many :genres, through: :tags
Series_Controller
before_action :select_genre
[...]
def new
@series = current_user.series.build
end
def edit
end
def create
@serie = current_user.series.build series_params
@serie.save
redirect_to admin_series_path
end
end
[...]
# Useful
def select_genre
@genres = Genre.all
end
表格
<select name="serie[genre_ids][]" multiple="multiple">
<% @series.each do |serie| %>
<option value="<%= serie.id %>"><%= serie.name %></option>
<% end %>
</select>
编辑:谢谢@Fabrizio Bertoglio,它适用于单一选项,但我无法让它适用于多种类型。
# SERIES CONTROLLER
def new
@series = current_user.series.build
@series.tags.build
end
# PARAMS
params.require(:serie).permit ...... tags_attributes: [ :genre_id ]
# GENRE MODEL
** adding 'optional: true' to 'belongs_to :taggable' **
表格
<select name="serie[tags_attributes][0][genre_id]">
<% @series.each do |serie| %>
<option value="<%= serie.id %>"><%= serie.name %></option>
<% end %>
</select>
正如我之前所说,它可以正常工作,但如果我将 genre_id 与 genre_ids 交换,它会停止工作,而是允许用户选择多种类型并创建多个标签。
# CONTROLLER
params.require(:serie).permit ...... tags_attributes: [ { genre_ids: [] } ]
# FORM
<select name="serie[tags_attributes][0][genre_ids][]" multiple="multiple">
【问题讨论】:
-
请同时显示
series_params的方法定义
标签: ruby-on-rails ruby forms controller