在导轨多态关联上多个选择形式



协会工作正常,因为我可以在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_idgenre_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个步骤:

  1. 配置模型并允许nested_attributes
  2. 构建嵌套形式
  3. 在控制器中,为嵌套对象配置您的强参数
  4. 使用您的strong_params在控制器中实现变量@serie,以创建关联对象

最新更新