[英]Rails 5 - has_many through: and nested fields_for in forms
我是RoR的新手(使用rails 5),並且通過以下方式遇到has_many的問題:association。
我想為不同的語言創建帶有不同標簽的類別。
這是我的模型:
class Language < ApplicationRecord
has_many :category_infos
has_many :categories, through: :category_infos
end
class Category < ApplicationRecord
has_many :category_infos
has_many :languages, through: :category_infos
accepts_nested_attributes_for :category_infos
end
class CategoryInfo < ApplicationRecord
belongs_to :language
belongs_to :category
accepts_nested_attributes_for :language
end
控制器:
class CategoriesController < ApplicationController
def new
@category = Category.new
@languages = Language.all
@languages.each do |language|
@category.category_infos.new(language:language)
end
end
def create
@category = Category.new(category_params)
if @category.save
redirect_to @category
else
render 'new'
end
end
private
def category_params
params.require(:category).permit(:name, category_infos_attributes:[:label, language_attributes: [:id, :language]])
end
end
表格:
<%= form_with model: @category, local: true do |form| %>
<% if @category.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@category.errors.count, "error") %>:
</h2>
<ul>
<% @category.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<br/>
<% end %>
<p>
<%= form.label :name %>
<%= form.text_field :name %>
</p>
<p>
Labels:
</p>
<table>
<% @category.category_infos.each do |category_info| %>
<tr>
<td>
<%= category_info.language.name %>
</td>
<td>
<%= form.fields_for :category_infos, category_info do |category_info_form| %>
<%= category_info_form.fields_for :language, category_info.language do |language_form| %>
<%= language_form.hidden_field :id, value: category_info.language.id %>
<%= language_form.hidden_field :name, value: category_info.language.name %>
<% end %>
<%= category_info_form.text_field :label %>
<% end %>
</td>
</tr>
<% end %>
</table>
<p>
<%= form.submit %>
</p>
<% end %>
創建新類別時,出現以下錯誤:
Couldn't find Language with ID=1 for CategoryInfo with ID=
在線:
@category = Category.new(category_params)
但是我已經在數據庫中注冊了幾種語言(1 =英語,2 =法語等...)
如何編寫表格,以便可以同時以英語,法語等創建類別及其CategoryInfos?
預先感謝您的回答
當您只想通過傳遞ID創建關聯時,就會犯下經典的新手錯誤,並使用fields_for
。
<%= form_with model: @category, local: true do |f| %>
# ...
<%= f.fields_for :category_infos do |cif| %>
<%= cif.collection_select(:language_id, Language.all, :name, :id) %>
<%= cif.text_field :label %>
<% end %>
<% end %>
雖然您還可以傳遞屬性,以使用戶同時創建語言,但這非常反樣式,因為它給單個控制器增加了很多責任。 如果允許用戶創建類別,但不能創建語言,也會產生授權問題。
如果需要該功能,請使用ajax將請求發送到單獨的語言控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.