协会工作正常,因为我可以在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">
您需要按照此说明来构建复杂形式。
这样,您可以创建一个具有创建@serie
的输入值的表单,也可以创建@serie.tags
。
您需要阅读该指南,但是合成需要执行以下3个步骤:
- 配置模型并允许
nested_attributes
- 构建嵌套形式
- 在控制器中,为嵌套对象配置您的强参数
- 使用您的strong_params在控制器中实现变量
@serie
,以创建关联对象