コントローラーで、def userの呼び出し(rails)
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 79
実現したいこと
View内で条件分岐されたif文を、コントローラー内に記述したいです。
コード
<% @posts.each do |post| %>
<% if post.user.id != @current_user.id && post.user.status == 2 %>
<% else %>
<%= post.name %>
<% end %>
postのuser.id がログインユーザーではない 且つ post保持者ステータスが2出ない というif文。
def user
return User.find_by(id: self.user_id)
end
def index
user = User.find_by(id: self.user_id)
@mypostpost.user.id != @current_user.id
@pstatus = Post.where.user(status: 2)
@posts = Post.all.order(created_at: :desc).where.not(id: @mypost.id, id: @pstatus.id)
end
エラー
undefined method `user_id' for #<PostsController:0x00007fba5e431b40> Did you mean? user_url
modelに記載のdef userがコントローラー内で反映されないため、エラーが出ます。
また、コントローラー内で記述してみましたが、反応が得られません。
どうぞ宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
modelで定義しているのは user でエラーが出ているのは user_id です。
「View内で条件分岐されたif文を、コントローラー内に記述」ということは、viewに渡す @posts が「postのuser がログインユーザーではない 且つ post保持者ステータスが2出ない」ものに絞り込んでおきたい
という意味でしょうか
まず、 user, user.id, user_id が混乱して使われてます。そこ注意です。
@posts = Post.joins(:user).
where.not(users: {id: current_user.id}).
where(users: {status: 2}).
order(created_at: :desc)
かな、と思うのですが
@mypostpost.user.id != @current_user.id
@pstatus = Post.where.user(status: 2)
の部分が理解できていないので、後半の条件where.not(id: @mypost.id, id: @pstatus.idは省いたので、必要なら追加して下さい
追記
def user
return User.find_by(id: self.user_id)
end
が気になったので念の為.
これ class Post に定義したのではないかと思うのですが、belongs_to :user って定義してますか?
それがあればこのmethodは不要です。
ないと上の回答がうまく動きません
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.00%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/12/01 02:15
また、追記の内容も、belongs_to :userがあれば記載は不要とのこと、ありがとうございます。
両方記載しておりました。
さて、ご質問させて頂いた件についてですが、言葉足らずで申し訳ないです。
A = postのuser.id がログインユーザーではない
B = post保持者ステータスが2出ない
(A 且つ B )の条件を持ったというif文にしたいのですが、現状AとBという2つの条件になっていると思います。
A或いはBいずれかの条件が揃った場合でも、その条件には該当させたくなく、両方の条件が揃った場合、該当としたいのですが、いかがでしょうか。
事前の質問が言葉足らずで申し訳ありません。
2019/12/01 12:42
2019/12/02 19:11
.join(:user)メソッドを活用した場合のandでチェインする方法は、どのような書き方が良いのでしょうか?
.where.not(users: {id: @current_user.id}, users: {status: 1})
.where.not("users: {id: @current_user.id} and users: {status: 1}")
.where.not(users: {id: @current_user.id} and users: {status: 1})
.where.not('users: {id = ?} and users: {status = ?}', @current_user.id, 1)
.where.not('users: {id} = ? and users: {status} = ?', @current_user.id, 1)
.where.not(['users: {id = ?} and users: {status = ?}', @current_user.id, 1])
.where.not(users: {id: @current_user.id}).and(Post.where(users: {status: 1}))
2019/12/02 19:20
2019/12/02 19:30
しかし、その回答にご返信しました通り、
A と Bの条件と分かれた2つのif文ではなく、
(A 且つ B )の条件を持ったというif文にしたいという部分が叶えられずにおります> <
2019/12/02 19:44
where.not(users: {id: current_user.id}). where(users: {status: 2}) のchainで
and の結果になっていませんか?
この部分実行時の log に SQLが出ているはずです。そこ見せて下さい
2019/12/02 20:01
このように記載されています。
2019/12/02 20:04
if post.user.id != @current_user.id && post.user.status == 2
の条件を求めていますが、現状
if post.user.id != @current_user.id || post.user.status == 2
という条件になっており。どちらかが該当された場合でも適応されPostが表示されなくなります。
2019/12/02 20:09 編集
って
WHERE "users"."id" != 1 AND "users"."status" = 1
ってことですから、ANDになってるでしょ? id が1でなくかつstatusが1になってますね
ん?
status が 2 になってないな。where(users: {status: 2}) になってます?
2019/12/02 20:28
ANDとなっていますが、その条件を別々に分けたくないのです。
一番上のindexに記載の通り、<% if post.user.id != @current_user.id && post.user.status == 2 %>に該当する場合は、スキップとしたいです。
しかし、今回の場合、最初のwhere.not(users: {id: current_user.id})の記載で、ログインユーザーのpostが全て表示されなくなります。
今回行いたいのは、
user.statusが2の場合、表示されなくなる。しかし、statusが2であっても、ログインユーザーの投稿の場合、表示する。です。
2019/12/02 20:37
「postのuser.id がログインユーザーではない 且つ post保持者ステータスが2出ない というif文」
とは違いますね
2019/12/02 20:43
次のコメントに詳しくしたいことを記載したつもりでした!
改めて、下記に記載しますが、いかがでしょうか。
A = postのuser.id がログインユーザーではない
B = post保持者ステータスが2出ない
(A 且つ B )の条件を持ったというif文にしたいのですが、現状AとBという2つの条件になっていると思います。
A或いはBいずれかの条件が揃った場合でも、その条件には該当させたくなく、両方の条件が揃った場合、該当としたいのですが、いかがでしょうか。
事前の質問が言葉足らずで申し訳ありません。
2019/12/02 21:43
言葉足らずではないです、不正確なんです.違うことを言ってるんです
やりたいこと「user.statusが2の場合、表示されなくなる。しかし、statusが2であっても、ログインユーザーの投稿の場合、表示する」
と
条件が合っていないんです
しかもどうしたいかがくるくる変わる
「statusが2でなく、または user_が ログインユーザ」の時表示
すなわち
「(A 且つ B )の条件」では無いとき表示
ですよね?
status ユーザ
==2 login 表示
==2 not login 非表示
!=2 login 表示
!= 2 not login 表示
ですね?
2019/12/02 22:01 編集
不正確でしたね、申し訳ないです!
この場合、どのようなコードが適切でしょうか。
2019/12/03 08:31
2019/12/03 14:00
ありがとうございます!
2019/12/03 14:01