0

Image と Lightbox の 2 つのモデルがあります。2 つのモデル (has_many) を関連付けるために、3 番目のモデル LightboxImages があります。

1 つのライトボックスには複数の画像を含めることができ、画像はさまざまなライトボックスに含めることができます。

ライトボックスは (リモート js を使用して) 動的に作成され、ユーザーはこのライトボックスに画像を動的に追加することもできます。

私の最初のアイデアは、LightboxImages コントローラーの create メソッドへの URL を単純に作成し、Lightbox Id と Image Id をパラメーターとして渡すことでした。

しかし、ユーザーはそのような動作を簡単にシミュレートできるため、このアプローチは脆弱で安全ではないように思われました。

この状況に最適な設計は何ですか?関係レコードを動的に作成しますか?

4

1 に答える 1

0

実際には 4 番目のモデル、ユーザーがあります。とにかくそうすると思います。

User has_many :lightboxes
Lightbox has_many :lightbox_items
Image has_many :lightbox_items
LightboxItem belongs_to :lightbox
LightboxItem belongs_to :image
Lightbox has_many :images, :through => :lightbox_item
Image has_many :lightboxes, :through => :lightbox_item

LightboxItem は、その特定の Lightbox 内の画像の位置などの追加データを保存する場所です。

重要なことは、すべてのライトボックスがユーザーに属していることです。これにより、コントローラー内のすべての AR 呼び出しを現在のユーザーにスコープすることができます。これにより、他のライト ボックスを変更できなくなります。

したがって、ユーザー carlos のライトボックス ID は 1 です。ユーザー phallstrom のライトボックス ID は 2 です。

コントローラーでは、何らかの方法current_userで前フィルターで現在のユーザーに設定します。次に、たとえば、指定されたライト ボックスを取得するアクションでは、次のようにします。

@lightbox = current_user.lightboxes.find_by_id(params[:id].to_i)

current_user が carlos で、params[:id] が 2 の場合、この方法では何も返されません。

同様に、他のすべての CRUD アクションについても、current_user にスコープを設定します。

于 2013-04-03T03:40:59.843 に答える