1

関係のある次の3つのモデルがあります。

# category.rb
class Category < ActiveRecord::Base
  has_many :category_marks
  accepts_nested_attributes_for :category_marks
end

# category_mark.rb
class CategoryMark < ActiveRecord::Base
  attr_accessible: :add, :stu, :inc

  validates_presence_of :user_group
  validates_presence_of :category_id
  belongs_to :category
  belongs_to :user_group
end

# user_group.rb
class UserGroup < ActiveRecord::Base
  has_many :category_marks
end

category_marksさまざまなカテゴリへのさまざまなユーザーグループのアクセス許可を記述します。新しいカテゴリを作成するときにカテゴリマークを作成しようとしています。したがって、accepts_nested_attributes_for。カテゴリの編集とcategory_marksの更新を同時に行うことはできますが、新しいカテゴリを作成するときはできません。これは私のcategories_controller.rb(無関係なビットが削除された)です:

class Admin::CategoriesController < ApplicationController

    def new
      @category = Category.new
      @category.category_marks.build(UserGroup.all.map{|ug| { user_group: ug }})

      respond_to do |format|
        format.html # new.html.erb
        format.json { render json: @category }
      end
    end

    def edit
      @category = Category.find(params[:id])
    end

    def create
      @category = Category.new
      @category.category_marks.build(UserGroup.all.map{|ug| { user_group: ug }})
      @category.attributes = params[:category]

      respond_to do |format|
        if @category.save
          format.html { redirect_to [:admin, :categories], notice: 'Category was successfully created.' }
          format.json { render json: @category, status: :created, location: @category }
        else
          format.html { render action: "new" }
          format.json { render json: @category.errors, status: :unprocessable_entity }
        end
      end
    end

    def update
      @category = Category.find(params[:id])

      respond_to do |format|
        if @category.update_attributes(params[:category])
          format.html { redirect_to [:admin, :categories], notice: 'Category was successfully updated.' }
          format.json { head :no_content }
        else
          format.html { render action: "edit" }
          format.json { render json: @category.errors, status: :unprocessable_entity }
        end
      end
    end
  end

すべてのカテゴリには、すべてのユーザーグループのカテゴリマークが必要です。そのため、このnewアクションでは、すべてのユーザーグループのカテゴリマークオブジェクトと関連付けを新しい@categoryオブジェクトに作成しています。これは正常に機能し、ネストされたフォームを使用して各カテゴリマークのフォームフィールドを表示できます。私が今抱えている問題は、これらのカテゴリマークをcreateアクションに保存することです。

params次のようになりcreateます:

{"utf8"=>"✓",
"authenticity_token"=>"0rNpYy7OB+DPuzmu8HoxX2MvTnkjUyU+Vej+a4RMh7s=",
"category"=>{
  "name"=>"test category",
  "color"=>"#00f",
  "parent_id"=>"3",
  "category_marks_attributes"=>{
    "0"=>{
      "stu"=>"1",
      "inc"=>"0",
      "add"=>"1"},
    "1"=>{
      "stu"=>"0",
      "inc"=>"1",
      "add"=>"1"}}},
"button"=>"",
"action"=>"create",
"controller"=>"admin/categories"}

フォームのコードを表示します。

<%= form_for([:admin, @category]) do |category_form| %>
  <ul>
    <li><%= category_form.label :name %> <%= category_form.text_field :name %></li>
    <li><%= category_form.label :color %> <%= category_form.text_field :color, class: :add_colour_picker %></li>
    <li><%= category_form.label :parent_id, "Parent category" %> <%= category_form.select :parent_id, Category.roots.delete_if{|c| c == @category}.map{|c| [c.name, c.id]}, include_blank: true %></li>
    <br />
    <h2>User Group Permissions</h2>
    <table>
      <tr>
        <th>User Group</th>
        <th>View Students</th>
        <th>View Incidents</th>
        <th>Add Incidents</th>
      </tr>
      <%= category_form.fields_for :category_marks do |category_marks_form| %>
      <%= category_marks_form.hidden_field :user_group_id, value: category_marks_form.object.user_group_id %>
        <tr>
          <td><%= category_marks_form.object.user_group.name %></td>
          <td><%= category_marks_form.check_box :stu %></td>
          <td><%= category_marks_form.check_box :inc %></td>
          <td><%= category_marks_form.check_box :add %></td>
        </tr>
      <% end %>
    </table>

    <li><%= button_tag "Save Category" %></li>
  </ul>
<% end %>
4

1 に答える 1

2

が欠落しているcategory_marks_attributesため、ユーザー入力に基づいて検証または保存されません。paramsuser_group_id

おそらく、ビューに次のようなものを追加する必要があります。

= category_marks_builder.hidden_field :group_id, value: category_marks_builder.object.group_id

また、あなたが持っているように動作すると確信していますが、私は行を取り除き、代わりに@category.attributes=電話をかけます.@category.update_attributes params[:category]@category.save

最後に、コントローラー@category.category_marks.buildで再度呼び出しを行う理由がわかりません。createこれで 2 セットが得られると思いますcategory_marks。1 つはユーザー入力、もう 1 つはデフォルト値です。

お役に立てば幸いです。

于 2013-01-25T17:30:07.683 に答える