2017-09-20 60 views
0

該協會工作正常,因爲我可以在IRB上玩它。我也可以編輯現有書籍添加標籤,但我不能創建並同時分配標籤(「標籤無效」驗證錯誤)。我想這是一個表單/控制器問題,我想我必須建立它,但我不知道如何。軌道上多重選擇形式多態關聯

## 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"> 
+0

請同時顯示'series_params'的方法定義 – bitsapien

回答

0

您需要按照此說明操作building complex forms

通過這種方式,您可以創建一個具有創建@serie的輸入值的表單,也可以創建@serie.tags

你需要閱讀該手冊,但在合成你需要做以下3個步驟:

  1. 配置模型,並允許nested_attributes
  2. 建立一個嵌套形式
  3. 在控制器,配置嵌套對象的強參數
  4. 使用strong_params在控制器中Instanciate變量@serie,以便它將創建關聯對象
+0

你可以看看我的編輯嗎? – user8638523