0

これはかなり一般的な状況に違いありませんが、私はそれを理解できません:

ポリモーフィックなコメント モデル、ポスト モデル、ユーザー モデルがあります。これは私の関連付けの設定です:

class Post < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class User < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  attr_accessible :content

  belongs_to :commentable, polymorphic: true
  belongs_to :user
end

ここで、commentable_id も user_id も attr_accessible にしたくありません。それらを大量割り当ての対象にしたくないからです。関連付けを通じてコメントを作成することが解決策であることはわかっていますが、両方の関連付けに対してそれを行うにはどうすればよいですか?

編集:

例: 私は投稿中で、コメントを作成したいと考えています。user_id があるとしましょう。その方法は次のとおりです。

@post.comments.create(user_id: 1, content: "bla bla")

これは機能しますが、コメントの user_id attr_accessible を作成する必要があります。私はセキュリティ上の理由からそれをしたくありません.コメントとユーザーを別の方法で関連付ける方法はありますか?

すべてのヘルパーに感謝します!

4

1 に答える 1

0

必要なものは次のとおりです。

user has_many :posts
user has_many :comments, :through :posts

post has_many :comments
post belongs_to :user

comment belongs_to :user
comment belongs_to :post

ユーザーは、投稿とコメントの両方に共通のエンティティです。ユーザーは、投稿が存在する場合にのみ投稿にコメントできます (したがって、ユーザー、コメント、投稿の間に has_many_through 関係があります)。残りの関係はかなり自明だと思います。

例:

user.posts.create(<post params>)

user.posts.find(1).comments.create(<comment params>)

user.posts #retrieve all posts
user.posts.find(1).comments #retrieve all comments by a user on the first post 

アップデート

ユーザーが所有していない投稿にコメントするには:

post = Post.find(params[:id]) 
user.comments.create(post_id => post.id, <other params>)

更新 2

基になるデータを変更するには、投稿オブジェクトを取得することが重要です。投稿テーブルに新しい列を追加できます。たとえば、投稿の id と 1 対 1 で対応するキー (16 進値を生成) を追加できます。デフォルトの投稿 ID の代わりにこのキーを表示するようにルートを変更することもできます。すなわち、変更

/posts/:id, /posts/:id/edit

/posts/:key, /posts/:key/edit

これで、キーを使用して投稿オブジェクトを取得し、必要な操作を実行できます。ユーザーは、URL を変更して投稿 ID を変更することができなくなります。より堅牢にするために、キーを暗号化し ( crypt gemをチェックアウト)、ルートに暗号化されたキーを表示し、キーを復号化して正しいオブジェクトを取得できます。

要約すると、投稿オブジェクトを一意に識別するために 1 つの属性を公開する必要があります。

于 2013-10-16T07:32:45.700 に答える