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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

2818閲覧

他モデルshowページへ飛ぶ際の条件分岐は??

s.k

総合スコア423

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2016/10/19 07:00

編集2016/10/20 02:25

###前提・実現したいこと
他モデルへのshowページへ飛べるように条件分岐をしたいです。

例えば、あるユーザーがUserとしてログインしていたとします。
そこから、Shopユーザーのshowページへ飛べるというイメージです。

Userログイン→Shopindexページ→Shopshowページ
###発生している問題・エラーメッセージ

shopindexページから
shopindexページ

株式会社ソラコムというshowページリンクをクリックすると、

undefined method `email' for nil:NilClass

showページのコードです。
下から6行目の_micropostパーシャルに問題があります。

【shops/show.html.erb】

<% provide(:title, @shop.shopname) %> <div class="row"> <!-- ページ左 --> <aside class="col-md-4"> <section class="shop_info"> <h1> <!-- アイコン --> <%= gravatar_to @shop %> <!-- ユーザー名 --> <%= @shop.shopname %> </h1> </section> <section class="stats"> <!-- follow,followerリンク --> <%= render 'shared/stats'%> </section> </aside> <!-- ページ右 --> <div class="col-md-8"> <!-- follow(shop-to-shop)ボタン --> <%= render 'friend_form' if shop_signed_in? %> <!-- follow(user-to-shop)ボタン --> <% if user_signed_in? %> <div id="follow_form"> <%= render 'associates/associate_links'%> </div> <% end %> <% if @shop.microposts.any? %> <!-- 投稿数 --> <h3>Microposts (<%= @shop.microposts.count %>)</h3> <ol class="microposts"> <!-- 投稿一覧 --> <%= render @microposts %> </ol> <%= will_paginate @microposts %> <% end %> </div> </div>

_micropostパーシャルです。
4行目のgaravatar_forがエラーとなっています。

【_micropost.html.erb】

<li id="micropost-<%= micropost.id %>"> <% if user_signed_in? %> <!-- ユーザーアイコン --> <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> <!-- ユーザー名 --> <span class="user"><%= link_to micropost.user.username, micropost.user %></span> <span class="content"> <!-- 投稿文 --> <%= micropost.content %> <!-- 投稿写真 --> <%= image_tag micropost.picture.url if micropost.picture? %> </span> <!-- 投稿時間 --> <span class="timestamp"> Posted <%= time_ago_in_words(micropost.created_at) %> ago. </span> <!-- 削除リンク --> <% if current_user?(micropost.user) %> <%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %> <% end %> <!-- お気に入り登録リンク --> <% if !current_user?(micropost.user) %> <div id="follow_form"> <%= render 'favorites/favorite_links', micropost: micropost %> </div> <% end %> <% elsif shop_signed_in? %> <!-- ショップアイコン --> <%= link_to gravatar_to(micropost.shop, size: 50), micropost.shop %> <!-- ショップ名 --> <span class="shop"><%= link_to micropost.shop.shopname, micropost.shop %></span> <span class="content"> <!-- 投稿文 --> <%= micropost.content %> <!-- 投稿写真 --> <%= image_tag micropost.picture.url if micropost.picture? %> </span> <!-- 投稿時間 --> <span class="timestamp"> Posted <%= time_ago_in_words(micropost.created_at) %> ago. </span> <!-- 削除リンク --> <% if current_shop?(micropost.shop) %> <%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %> <% end %> <!-- いいね!リンク --> <% if !current_shop?(micropost.shop) %> <div id="follow_form"> <%= render 'likes/like_links', micropost: micropost %> </div> <% end %> <% end %> </li>

gravatarメソッドです。
コードは以下です。
この4行目、emailがnilだとエラーメッセージがでます。。。

【users_helper】

module UsersHelper def gravatar_for(user, options = { size: 50 } ) size = options[:size] gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}" image_tag(gravatar_url, alt: user.username, class: "gravatar") end def current_user?(user) user == current_user end end

_micropostパーシャルの時にshop専用に用意したメソッドgravatar_toメソッドを使えばこのような問題は起こらないと思うのです。

しかし、_micropostパーシャルの条件分岐がuser_signed_in?しかないので、garavatar_forを使わざるを得ない状況に陥ってしまいます。

そこで、この問題を解決できる条件分岐はないかお聞きしたいです!

よろしくおねがいします。

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

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

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

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

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

cameluby

2016/10/19 14:47 編集

もう少し分かりやすく質問していただけると助かります。 やりたいことが分かれば、答えることができると思うので!
s.k

2016/10/20 02:26

すいません!もう一度書いてみました!どうしても伝えたいことがありすぎてまとまりませんが頑張りました!まだまだ、シンプルに書けますので、情報修正の依頼をガンガンだしてください!camelubyさんよろしくお願いします!
guest

回答2

0

自分で荒いですが、条件分岐を作ってみました。

【users_controller.rb】

・・・・省略・・・・ def show @account = 3←追加 @page = 2←追加 @user = User.find(params[:id]) @microposts = @user.microposts.paginate(page: params[:page]) end ・・・・省略・・・・

【shops_controller.rb】

def show @account = 4 ←追加 @page = 1 ←追加 @shop = Shop.find(params[:id]) @microposts = @shop.microposts.paginate(page: params[:page]) end
<li id="micropost-<%= micropost.id %>"> <% if @page == 2 || @account == 3 %> ←追加 <!-- ユーザーアイコン --> <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> <!-- ユーザー名 --> <span class="user"><%= link_to micropost.user.username, micropost.user %></span> <span class="content"> <!-- 投稿文 --> <%= micropost.content %> <!-- 投稿写真 --> <%= image_tag micropost.picture.url if micropost.picture? %> </span> <!-- 投稿時間 --> <span class="timestamp"> Posted <%= time_ago_in_words(micropost.created_at) %> ago. </span> <!-- 削除リンク --> <% if current_user?(micropost.user) %> <%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %> <% end %> <!-- お気に入り登録リンク user-to-user--> <% if user_signed_in? %> <% if !current_user?(micropost.user) %> <div id="follow_form"> <%= render 'favorites/favorite_links', micropost: micropost %> </div> <% end %> <% end %> <% elsif @page == 1 || @account == 4 %> ←追加 <!-- ショップアイコン --> <%= link_to gravatar_to(micropost.shop, size: 50), micropost.shop %> <!-- ショップ名 --> <span class="shop"><%= link_to micropost.shop.shopname, micropost.shop %></span> <span class="content"> <!-- 投稿文 --> <%= micropost.content %> <!-- 投稿写真 --> <%= image_tag micropost.picture.url if micropost.picture? %> </span> <!-- 投稿時間 --> <span class="timestamp"> Posted <%= time_ago_in_words(micropost.created_at) %> ago. </span> <!-- 削除リンク --> <% if current_shop?(micropost.shop) %> <%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %> <% end %> <!-- いいね!リンク shopver-to-shop --> <% if shop_signed_in? %> <% if !current_shop?(micropost.shop) %> <div id="follow_form"> <%= render 'likes/like_links', micropost: micropost %> </div> <% end %> <% end %> <% end %> </li>

上記を追加したことで、
①Userログイン状態で、Shopモデルからデータを取りだす(shops/show.html.erbを表示させる)
②Userログイン状態で、Userモデルからデータを取り出す(users/show.html.erbを表示させる)
③Shopログイン状態で、Userモデルからデータを取りだす(users/show.html.erbを表示させる)
④Shopログイン状態で、Shopモデルからデータを取り出す(shops/show.html.erbを表示させる)

ように無理やりしました。

>camelubyさん

画像表示のgaravatar_forを最初にusers.helper.rbで定義しましたが、
そのメソッドはShopモデルでは使えませんでした。(メソッド内容がuserのデータを取り出すことしかできないため)ですので、Shops.helper.rbで名前を少し変えて定義しました。
それが↓にあるものです。

【users.helper.rb】

def gravatar_for(user, options = { size: 50 } ) size = options[:size] gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}" image_tag(gravatar_url, alt: user.username, class: "gravatar") end

【shops.helper.rb】

def gravatar_to(shop, options = { size: 50 } ) size = options[:size] gravatar_id = Digest::MD5::hexdigest(shop.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}" image_tag(gravatar_url, alt: shop.shopname, class: "gravatar") end

投稿2016/10/20 12:49

s.k

総合スコア423

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

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

0

ベストアンサー

ruby

1 <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>

ここで呼ばれている、micropost.usernilになっているようです。
micropostに紐付いたuserが存在しないことが原因だと思います。

shop専用に用意したメソッドgravatar_toメソッドを使えばこのような問題は起こらないと思うのです。

これがどういう意味か分かりませんでした。


_micropost.html.erbをusers_controllerとshops_controllerで共通で使用したいということであれば、
controller_nameメソッドを使用して分岐することができます。
質問者さんが追加した回答をみると、users_controllerの時は上の分岐、shops_controllerの時は下の分岐になっていますね。
なのでそれぞれ、

<% if controller_name = "users" %> ←追加

ruby

1 <% elsif controller_name = "shops" %> ←追加

のようにしたら良さそうです。
controllerからは@page@accountの記述は消して構いません。

ただ、これだと共有できている部分が

html

1<li id="micropost-<%= micropost.id %>"> 2</li>

しか無いので、ファイル自体を分けても良いのかな?と思いますが。。。

ruby

1# _micropost.html.erb 2 3<li id="micropost-<%= micropost.id %>"> 4 <% if controller_name = "users" %> ←追加 5 <!-- ユーザーアイコン --> 6 <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> 7 <!-- ユーザー名 --> 8 <span class="user"><%= link_to micropost.user.username, micropost.user %></span> 9 <span class="content"> 10 <!-- 投稿文 --> 11 <%= micropost.content %> 12 <!-- 投稿写真 --> 13 <%= image_tag micropost.picture.url if micropost.picture? %> 14 </span> 15 <!-- 投稿時間 --> 16 <span class="timestamp"> 17 Posted <%= time_ago_in_words(micropost.created_at) %> ago. 18 </span> 19 20 <!-- 削除リンク --> 21 <% if current_user?(micropost.user) %> 22 <%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %> 23 <% end %> 24 25 <!-- お気に入り登録リンク user-to-user--> 26 <% if user_signed_in? %> 27 <% if !current_user?(micropost.user) %> 28 <div id="follow_form"> 29 <%= render 'favorites/favorite_links', micropost: micropost %> 30 </div> 31 <% end %> 32 <% end %> 33 34 <% elsif controller_name = "shops" %> ←追加 35 <!-- ショップアイコン --> 36 <%= link_to gravatar_to(micropost.shop, size: 50), micropost.shop %> 37 <!-- ショップ名 --> 38 <span class="shop"><%= link_to micropost.shop.shopname, micropost.shop %></span> 39 <span class="content"> 40 <!-- 投稿文 --> 41 <%= micropost.content %> 42 <!-- 投稿写真 --> 43 <%= image_tag micropost.picture.url if micropost.picture? %> 44 </span> 45 <!-- 投稿時間 --> 46 <span class="timestamp"> 47 Posted <%= time_ago_in_words(micropost.created_at) %> ago. 48 </span> 49 50 <!-- 削除リンク --> 51 <% if current_shop?(micropost.shop) %> 52 <%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %> 53 <% end %> 54 55 <!-- いいね!リンク shopver-to-shop --> 56 <% if shop_signed_in? %> 57 <% if !current_shop?(micropost.shop) %> 58 <div id="follow_form"> 59 <%= render 'likes/like_links', micropost: micropost %> 60 </div> 61 <% end %> 62 <% end %> 63 64 <% end %> 65</li>

投稿2016/10/20 12:16

編集2016/10/21 15:13
cameluby

総合スコア891

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

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

s.k

2016/10/20 12:50

上をみてほしいです!!
s.k

2016/10/20 12:50

補足してみました。
cameluby

2016/10/20 13:06

_micropost.html.erb をusers_controllerとshops_controllerで共通で使用しているということでしょうか?
s.k

2016/10/21 07:09

はい!
cameluby

2016/10/21 15:13

それを踏まえ追記しました。
s.k

2016/10/21 15:22

camelubyさん ありがとうございます! そんな便利なメソッドがあるのですか… 確かにファイルを分けた方がいいですよね。 これからどんどん機能を書いていけば、分岐も複雑になっていきますし! 完成はいつになるか… 回答がわかりやすすぎて、逆に申し訳なく感じてきました。。。 明日、ファイル分けてみます!
cameluby

2016/10/21 15:29

方法はいくらでもありますし、最初は「とりあえず書いてみる、動くものを書いてみる」というのも重要だと思うので、質問者さんの@accountと@pageの方法も決して駄目なわけではありませんよ! ただRailsが用意してくれているメソッドを使うと簡単に書けることも多いので、段々と知っていけば良いと思います! いろいろ試してみてください!
s.k

2016/10/22 01:08

はい!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問