【问题标题】:Multiple select form on rails polymorphic associationsRails 多态关联上的多选形式
【发布时间】: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


【解决方案1】:

您需要按照building complex forms 的说明进行操作。

这样您可以创建一个表单,该表单具有用于创建@serie 的输入值,也用于创建@serie.tags。

您需要阅读该指南,但在综合中您需要执行以下 3 个步骤:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多