簡體   English   中英

Rails 5-has_many through:和表格中的嵌套fields_for

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM