5

私は非常に単純なモデルを持っています

class Lifestyle < ActiveRecord::Base
  attr_accessible :name
  has_and_belongs_to_many :profiles
end

has_and_belongs_to_many関係があることProfile

class Profile < ActiveRecord::Base
  attr_accessible ...

  belongs_to :occupation

  has_and_belongs_to_many :lifestyles
  accepts_nested_attributes_for :lifestyles
end

ActiveAdmin を使用してプロファイル オブジェクトを編集したいのですが、ライフスタイルをプロファイルに割り当てたいと考えています。belongs_to :occupationこれは、利用可能な職業が事前に入力されたオプションを備えたドロップボックスに ActiveAdmin によって自動的に分類されるため、 の処理に似ているはずです。

フォームビルダーメソッドを使用しようとしましたhas_manyが、ライフスタイルの名前を入力するフォームを表示するだけで、送信時にエラーが返されました.

    f.object.lifestyles.build
    f.has_many :lifestyles do |l|
      l.input :name
    end

私が得るエラー:

Can't mass-assign protected attributes: lifestyles_attributes

私にとって完璧な方法は、DB のライフスタイルごとに 1 つずつ、複数のチェックボックスを作成することです。選択されている場合はライフスタイルがプロファイルに関連付けられていることを意味し、選択されていない場合は関連付けが削除されていることを意味します。

これが ActiveAdmin を使用して可能であり、これに対処するための非常に複雑なロジックを作成する必要がないことに大きな疑問を抱いています。ご意見をお寄せいただき、この方法をとるべきか、別のアプローチをとるべきかアドバイスをいただければ幸いです。

4

3 に答える 3

18

いくつかの調査の後、私は自分の質問に答える準備ができています。

まず、修正を提案してくれた @Lichtamberg に感謝しなければなりません。ただし、それは物事を複雑にするだけで (この場合は問題ではありませんが、セキュリティに関しても)、理想的なソリューションに到達するのに役立ちません。

さらに掘り下げてみると、これは Rails では非常に一般的なシナリオであり、実際にはRyan Bates のスクリーンキャスト #17で説明されていることがわかりました。

したがって、Rails では、has_and_belongs_to_many (短い形式の HABTM) 関連付けがある場合、このメソッドを使用して他の関連付けられたオブジェクトの ID を簡単に設定できます。

profile.lifestyle_ids = [1,2]

また、ライフスタイル ID に attr_accessible を設定した場合、これは明らかにフォームで機能します。

class Profile < ActiveRecord::Base
  attr_accessible :lifestyle_ids
end

ActiveAdmin では Formtastic を使用しているため、このメソッドを使用して正しいフィールド (この場合はチェックボックス) を出力できます。

f.input :lifestyles, as: :check_boxes, collection: Lifestyle.all

また、フォーム ビューを簡略化したので、次のようになりました。

  form do |f|
    f.inputs # Include the default inputs
    f.inputs "Lifestlyes" do # Make a panel that holds inputs for lifestyles
      f.input :lifestyles, as: :check_boxes, collection: Lifestyle.all # Use formtastic to output my collection of checkboxes
    end
    f.actions # Include the default actions
  end

これでビューに完全にレンダリングされましたが、変更を送信しようとすると、次のデータベース エラーが発生します。

PG::Error: ERROR:  null value in column "created_at" violates not-null constraint
: INSERT INTO "lifestyles_profiles" ("profile_id", "lifestyle_id") VALUES (2, 1) RETURNING "id"

これは、Rails 3.2 が HABTM 関連付けテーブルのタイムスタンプを自動的に更新しないことが原因であることがわかりました (これらは追加の属性であり、Rails は_id属性のみを処理するためです。

これを修正するには 2 つの解決策があります。

  1. アソシエーションを hm:t ( has_many, :through =>)に変換します。
  2. またはテーブルからタイムスタンプを削除します

タイムスタンプやその他の属性は必要ないため、2) を選択します。

これが同じ問題を抱えている他の人々に役立つことを願っています。

編集: @cdesrosiers が解決策に最も近かったのですが、彼の回答を読む前に既にこの回答を書きました。それにしても、これは素晴らしい。私はたくさんのことを学んでいます。

于 2012-11-01T20:09:41.520 に答える
2

Active Admin は、formtastic を介してシン DSL (ドメイン固有言語) を作成するため、フォームのカスタマイズが必要な場合は、 formastic のドキュメントを参照することをお勧めします。そこでは、関係f.input :lifestyles, :as => :check_boxesを変更するために使用できる可能性があることがわかります。has_and_belongs_to_many

あなたの特定のケースでこのヘルパーを自分で試したことがないので、「かもしれない」と言いますが、これらは自動的に機能する傾向があるので、試してみてください。

また、 fromaccepts_nested_attributes_for :lifestylesの属性を実際に変更したい場合を除いて、おそらく必要ないでしょう。これは、アクティブな管理者を使用する場合には特に有用ではないと思います (直接変更するだけです)。lifestylesprofileslifestyles

于 2012-11-01T20:01:59.500 に答える
0

追加

attr_accessible :lifestyles_attributes

フェ:

class AccountsController < ApplicationController
  attr_accessible :first_name, :last_name
end
于 2012-10-29T23:10:06.047 に答える