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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Q&A

解決済

1回答

1284閲覧

【Rails】画面表示の条件分岐がうまくいかない

hiroki1121

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/05/16 14:03

編集2021/05/16 15:41

分からないこと

ユーザーのマイページで、自分が投稿したもののみを一覧表示させ、投稿がない場合は「投稿がありません」の記述に変更したい

現状、current_contracted_side_user.id == @post.contracted_side_user_idの部分がうまく行ってないと思われます

条件分岐のやり方は問題ないと思うので、idの渡し方の問題かなと思いますがうまくいきません

また、不足するコードがありましたら、ご連絡をお願いします

コントローラー

class ContractedSideUsersController < ApplicationController before_action :authenticate_any! def show @posts = Post.where(params[contracted_side_user_id: current_contracted_side_user.id]) @post = Post.find_by(contracted_side_user_id: current_contracted_side_user.id) end private def authenticate_any! redirect_to new_contracted_side_user_session_path unless contracted_side_user_signed_in? end end

ビュー

<% if @posts.present? && current_contracted_side_user.id == @post.contracted_side_user_id %> <% @posts.each do |post| %> <%= render "shared/company_detail", post: post %> <div class="post-btn-form"> <div class="posted-edit-btn-form"> <%= link_to edit_post_path(post), method: :get, class:"posted-edit-btn" do %> <i class="fas fa-edit">編集する</i> <% end %> </div> <div class="posted-delete-btn-form"> <%= link_to post_path(post), method: :delete, class:"posted-delete-btn" do %> <i class="far fa-trash-alt">削除する</i> <% end %> </div> </div> <% end %> <% else %> <div class="no-search-message"> <i class="fas fa-exclamation-triangle">投稿がありません</i> </div> <% end %> コード

仮設、検証

@postsはwhereで取得しているため、contracted_side_user.id == @posts.contracted_side_user_idとすることができない
@post = Post.find_by(contracted_side_user_id: current_contracted_side_user.id)とすることで、最初にヒットした(自分の投稿の)idが存在すれば、表示できるようにする

検証結果

「投稿がありません」の画面が表示される

環境

ruby 2.7.2
Rails 6.1.3.1
VSCode
MySQL

post.rb

class Post < ApplicationRecord has_one_attached :image belongs_to :contracted_side_user has_many :favorites, dependent: :destroy has_many :reviews, dependent: :destroy has_many :consignment_side_users, through: :favirites has_many :consignment_side_users, through: :reviews VALID_POST_CODE_REGEX = /\A\d{3}-\d{4}\z/.freeze VALID_EAMIL_REGEX = /\A[A-Za-z0-9.+_-]+@([A-Za-z0-9_-]+.)+[A-Za-z]{2,}\z/.freeze VALID_PHONE_NUMBER_REGEX = /\A\d{10,11}\z/.freeze VALID_COMPANY_URL_REGEX = /\A#{URI::regexp(%w(http https))}\z/.freeze with_options presence: true do validates :image validates :industry_id, numericality: { other_than: 1, message: 'は---以外を選択してください' } validates :company_name validates :post_code, format: { with: VALID_POST_CODE_REGEX, message: 'を正しく入力してください' } validates :prefecture_id, numericality: { other_than: 1, message: 'は---以外を選択してください' } validates :address validates :employee_number validates :representative_name validates :email, format: { with: VALID_EAMIL_REGEX, message: 'を正しく入力してください' } validates :represent_phone_number, format: { with: VALID_PHONE_NUMBER_REGEX, message: 'を正しく入力してください' } validates :business_detail, length: { maximum: 500 } end validates :company_url, format: { with: VALID_COMPANY_URL_REGEX, message: 'を正しく入力してください' }, allow_blank: true validates :direct_phone_number, format: { with: VALID_PHONE_NUMBER_REGEX, message: 'を正しく入力してください' }, allow_blank: true extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :industry belongs_to :prefecture end

contracted_side_user.rb

class ContractedSideUser < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :posts VALID_EAMIL_REGEX = /\A[A-Za-z0-9.+_-]+@([A-Za-z0-9_-]+.)+[A-Za-z]{2,}\z/.freeze VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze VALID_NAME_REGEX = /\A[ぁ-んァ-ヶ一-龥々ー]+\z/.freeze VALID_NAME_RUBY_REGEX = /\A[ァ-ヶ]+\z/.freeze with_options presence: true do validates :email, uniqueness: { case_sensitive: true }, format: { with: VALID_EAMIL_REGEX, message: 'を正しく入力してください' } validates :password, format: { with: VALID_PASSWORD_REGEX, message: 'を正しく入力してください' } validates :last_name, format: { with: VALID_NAME_REGEX, message: 'を正しく入力してください' } validates :first_name, format: { with: VALID_NAME_REGEX, message: 'を正しく入力してください' } validates :last_name_ruby, format: { with: VALID_NAME_RUBY_REGEX, message: 'を正しく入力してください' } validates :first_name_ruby, format: { with: VALID_NAME_RUBY_REGEX, message: 'を正しく入力してください' } end end

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/16 15:17

解決方法は何となくわかるのですが、詳しく見たいので、モデル(model/contracted_side_user.rbとmodel/post.rb)の記述を見せて頂きたいです。可能でしょうか?
hiroki1121

2021/05/16 15:44

yukirisayuさん モデル(model/contracted_side_user.rbとmodel/post.rb)を追加しました。 ご確認のほどよろしくお願いします。
guest

回答1

0

ベストアンサー

追記ありがとうございます。

結論としましては、

show

1@posts = Post.where(params[contracted_side_user_id:current_contracted_side_user.id]) 2

が違うかなと思います。whereの構文は

対象.where(探したいカラムの名前: 探したいものの名前)

となりますので、

@posts = Post.where(contracted_side_user_id: current_contracted_side_user.id)

となります。
(参考: https://qiita.com/nakayuu07/items/3d5e2f8784b6f18186f2#where )

エラーはこれで直るかなと思いますが、少し記述を見て思う事があるので、ここからはちょっとしたお節介です。垂れ流しで見て頂けると幸いです。

これだけの複雑なバリデーション・正規表現の記述が出来ているのに対し、アソシエーション・deviseのヘルパーを利用されていないことに疑問を感じます。他の言語を勉強されていて、Rubyについての理解が浅い等でしたら大変申し訳ありませんが、/\A[A-Za-z0-9.+_-]+@([A-Za-z0-9_-]+.)+[A-Za-z]{2,}\z/とは何か、has_many :postsを書く意味は何か、お調べになさったり、理解をされていらっしゃいますか?
前述は正規表現で、後述はリレーションを組むために記述されています。

正規表現については多言語でも使われていますので、検索すれば出ると思います。リレーションについてはpikawakaさんの記事が分かりやすいです( https://pikawaka.com/rails/association )
これらの理解が深まれば、showアクションの記述をもう少し簡潔に記述が可能かと思います。

deviseについては、before_action :authenticate_user!というヘルパーがあります
こういったgemの情報については公式を読むのをオススメします。( https://github.com/heartcombo/devise )
最初は少し分かりにくいかもしれませんが、変更点なども確実ですし、有名なものはREADMEが整備されています。Qiitaの記事と併用して読んでみてください。

メゾットや定義については深く知ったほうが記述を短く出来たり、分かりやすく出来たりします。
もちろん、全てを理解しようとすると時間が掛かり過ぎてしまうので、全てでは無くてもいいですが、少しそれらについてお調べ頂ければ幸いです。

hiroki1121さんは、質問内容に考察を書き、ご自身で考えられている点、とても素晴らしいと思います。
コピペで対応していた仲間はプログラミングが嫌になってしまい、辞めたり適当になってしまった人が多かったので、お節介ですが、書かせて頂きました。
厄介な長文で申し訳ないです。hiroki1121さんの成長を願っております。

これからも学習頑張ってください。

投稿2021/05/16 16:11

編集2021/05/16 17:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiroki1121

2021/05/17 01:55

yukirisayuさんご回答ありがとうございます! 無事、問題なく表示することができました。 モデルに関してもご指摘ありがとうございます! 私自身、プログラミング初心者であり知識が不足しておりました。 今一度、アソシエーション・deviseのヘルパーについて勉強してみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問