質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1278閲覧

railsのactionに制限をもたせたい

KosukeYamamoto

総合スコア220

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/03/21 06:06

編集2020/03/21 07:07

【やりたいこと】
railsのactionに制限をもたせたいのですが、やり方はわかりますでしょうか。

【やってみたこと】

commentモデルの中に

def add_like @post = Post.find(params[:post_id]) @comment = @post.comments.find(params[:id]) @comment.increment!(:Evaluation) redirect_to post_path(@post) end

上記のようなadd_likeというactionがあります。

こちらを1comment毎 1:user 1回のみに制限したいです。

現在userモデルで、下記のように行なっていますが、書き方が間違えているようです。

authenticates_with_sorcery! has_many :posts, dependent: :destroy has_many :comments, dependent: :destroy has_many :likes, dependent: :destroy has_many :comment_Evaluation_posts, through: :comment.Evaluation, source: :comment def already_liked?(comment) self.comments.Evaluations.exists?(id: comment.id) end
class Comment < ApplicationRecord belongs_to :post belongs_to :user validates :body, presence: true has_many :likes has_many :liked_users, through: :likes, source: :user validates_uniqueness_of :Evaluation, scope: :user_id end
class Post < ApplicationRecord belongs_to :user has_many :comments has_many :likes has_many :liked_users, through: :likes, source: :user validates :user, presence: true validates :content, presence: true #validates :image, presence: true serialize :image, Array mount_uploaders :image, ImageUploader scope :get_by_title, ->(title) { where("title like ?", "%#{title}%") } scope :get_by_genre, ->(genre) { where("genre like ?", "%#{genre}%") } end

参考サイト:https://qiita.com/nojinoji/items/2c66499848d882c31ffa

なお上記参考サイトはlikeというモデルを作成していますが、私はcommentモデルにEvaluationというカラムを作成していいねを行なっています。

(各commentにいいねを紐付けるためです)

お忙しいところすみませんが、アドバイスのほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問内容に矛盾がある?様に思えます。

1>上記参考サイトはlikeというモデルを作成していますが、私はcommentモデルにEvaluationというカラムを作成していいねを行なっています。
これは Likeモデルを作っていないということですか?
ではなぜ Userが has_many :likes なのでしょう?

2 全体像ですが
AさんのPostにBさんがcommentしそれをCさんが良いねする ということで合ってます?
すると commentモデル の EvaluationというカラムでCさんが良いねを行うと、Dさんは良いね出来ないってことですか?

いずれにせよUserと関連しているモデルのcodeも載せてください。

投稿2020/03/21 06:31

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KosukeYamamoto

2020/03/21 06:45

winterboumさん ご回答誠にありがとうございます。 また的確なご指摘ありがとうございます。 >1の確認について Likeモデルは作りましたが、こちらを現在は使用していません。 というのも、Likeモデルにすると、commentに紐付けができなかったためです。 Likeモデルは無視してください。ややこしくて、すみません。 >2の確認について 前提をお伝えしておらず、大変失礼いたしました。 前提をお伝えさせていただきます。 Aさんのpost(質問)に対して、BさんやCさんがcomment(回答)をしてくれます。 そのcomment(回答)に対しA、B、Cがいいねをすることができます。 しかし、各ユーザーは各commentに対して一回のみいいねができるようにしたいです。 userに関係するモデルは下記の2つです。 ``` class Comment < ApplicationRecord belongs_to :post belongs_to :user validates :body, presence: true has_many :likes has_many :liked_users, through: :likes, source: :user validates_uniqueness_of :Evaluation, scope: :user_id end ``` ``` class Post < ApplicationRecord belongs_to :user has_many :comments has_many :likes has_many :liked_users, through: :likes, source: :user validates :user, presence: true validates :content, presence: true #validates :image, presence: true serialize :image, Array mount_uploaders :image, ImageUploader scope :get_by_title, ->(title) { where("title like ?", "%#{title}%") } scope :get_by_genre, ->(genre) { where("genre like ?", "%#{genre}%") } end ``` 以上よろしくお願いいたします。
winterboum

2020/03/21 06:48

追加したcodeは質問の方に移してください。他の方のために。 > comment(回答)に対しA、B、Cがいいねをすることができます ということですと Evaluation カラムでは対応出来ないのでは? (大文字から始まる、というのもおかしいのですが) ABCが良いねした時は commentのEvaluationはどういう値が入る?
winterboum

2020/03/21 06:50

Likeが無いのに、3つのモデルどれにも like があるのはなぜ?
KosukeYamamoto

2020/03/21 07:10

>追加したcodeは質問の方に移してください。他の方のために。 追加いたしました。 > comment(回答)に対しA、B、Cがいいねをすることができます >ということですと Evaluation カラムでは対応出来ないのでは? >(大文字から始まる、というのもおかしいのですが) >ABCが良いねした時は commentのEvaluationはどういう値が入る? integerで0から加算されます。 このままではBCがいいねできないということかしこまりました。 今後回収いたします。 一旦、この時点では、1ユーザー1いいねの制限方法をお伺いしたいです。 >Likeが無いのに、3つのモデルどれにも like があるのはなぜ? こちらはあとで使用することがあるかもしれないと思い、残しています。一旦無視していただければ幸いです。 以上よろしくお願いいたします。
winterboum

2020/03/21 11:19

どういう方法で良いねするか、が決まらないと、制限する方法も決まらないです。 一般的な Likeを使う方法で実装進めて頂いて、それができてから制限を掛けましょう 例えば今の方法だと、一人しか良いねが出来ないのですから、一人が一回しか出来ないことは実現出来ちゃってます
winterboum

2020/03/21 11:21

あ、 良いねの回数を evaluationに入れるってことか。 誰が入れたかをどこかに記録する必要がありますね。 結局Likeが必要です
KosukeYamamoto

2020/03/21 22:21

winterboumさん 色々考えてくださって、ありがとうございます。 一旦、設計を考えます。 またぜひよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問