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

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

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

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

Ruby on Rails

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

Q&A

2回答

703閲覧

link_toを使ってviewからコントローラーに値を渡したいのですが、うまくいかないので説明お願いします。

gen515

総合スコア5

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/04/23 22:42

###解決したい事
一覧ページから詳細ページに移動したいのですが、うまくいきません。

###ソースコード
users/show.html.erb

ruby

1<div class="container"> 2 <h2 style="text-align: center;"><%= @user.name %>の投稿一覧</h2> 3 <div class="center-block"> 4 <%= link_to "写真詳細ページ", photo_path(@photo.id) %> 5 <% @photos.each do |photo| %> 6 <div><a href="<%= photo_path %>">写真の詳細ページ</a></div> 7 <div style="border: 2px solid;"> 8 <%= image_tag photo.image.url if photo.image? %> 9 <%= photo.content %> 10 </div> 11 <% end %> 12 </div> 13</div>

photos/show.html.erb

ruby

1<p id="notice"><%= notice %></p> 2<div class="row"> 3 <div class="offset-md-3 col-md-5"> 4 <p> 5 <%= image_tag @photo.image.url if @photo.image? %> 6 </p> 7 <p> 8 <strong>クイズの問題:</strong> 9 <%= @photo.content %> 10 </p> 11 <%= link_to "回答する", new_photo_answer_path(@photo) %> 12 13 <ul class="list-unstyled"> 14 <% @answers.each do |answer| %> 15 <li class="media"> 16 <div class="media-body"> 17 <div> 18 <%= answer.user.name %> 19 </div> 20 <div> 21 <%= answer.content %> 22 </div> 23 </div> 24 </li> 25 <% end %> 26 </ul> 27 </div> 28</div> 29 30<%= link_to '戻る', photos_path %> | 31<%= link_to '編集', edit_photo_path(@photo) %> 32

users_controller.rb

ruby

1class UsersController < ApplicationController 2 before_action :require_user_logged_in, only: [:show] 3 def index 4 end 5 6 def show 7 @user = User.find(params[:id]) 8 @photos = @user.photos.order(id: :desc).page(params[:page]) 9 end 10 11 def new 12 @user = User.new 13 end 14 15 def create 16 @user = User.new(user_params) 17 18 if @user.save 19 flash[:success] = 'ユーザを登録しました。' 20 redirect_to @user 21 else 22 flash.now[:danger] = 'ユーザの登録に失敗しました。' 23 render :new 24 end 25 end 26 27 private 28 29 def user_params 30 params.require(:user).permit(:name, :email, :password, :password_confirmation) 31 end 32end 33

photos_controller.rb

ruby

1class PhotosController < ApplicationController 2 before_action :set_photo, only: %i[ show edit update destroy ] 3 4 # GET /photos or /photos.json 5 def index 6 @photos = Photo.all 7 end 8 9 # GET /photos/1 or /photos/1.json 10 def show 11 @photo = Photo.find(params[:id]) 12 @answers = @photo.answers 13 @answer = current_user.answers.new 14 end 15 16 # GET /photos/new 17 def new 18 @photo = Photo.new 19 end 20 21 # GET /photos/1/edit 22 def edit 23 end 24 25 # POST /photos or /photos.json 26 def create 27 @photo = current_user.photos.new(photo_params) 28 29 if @photo.save 30 flash[:success] = '投稿に成功しました。' 31 redirect_to photos_path 32 else 33 flash.now[:danger] = "投稿に失敗しました。" 34 render :new 35 end 36 end 37 38 # PATCH/PUT /photos/1 or /photos/1.json 39 def update 40 respond_to do |format| 41 if @photo.update(photo_params) 42 format.html { redirect_to @photo, notice: "Photo was successfully updated." } 43 format.json { render :show, status: :ok, location: @photo } 44 else 45 format.html { render :edit, status: :unprocessable_entity } 46 format.json { render json: @photo.errors, status: :unprocessable_entity } 47 end 48 end 49 end 50 51 # DELETE /photos/1 or /photos/1.json 52 def destroy 53 @photo.destroy 54 respond_to do |format| 55 format.html { redirect_to photos_url, notice: "Photo was successfully destroyed." } 56 format.json { head :no_content } 57 end 58 end 59 60 private 61 # Use callbacks to share common setup or constraints between actions. 62 def set_photo 63 @photo = Photo.find(params[:id]) 64 end 65 66 # Only allow a list of trusted parameters through. 67 def photo_params 68 params.require(:photo).permit(:image, :content) 69 end 70end 71

routes.rb

ruby

1Rails.application.routes.draw do 2 3 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 4 root to: 'toppages#index' 5 6 get 'login', to: 'sessions#new' 7 post 'login', to: 'sessions#create' 8 delete 'logout', to: 'sessions#destroy' 9 10 get 'signup', to: 'users#new' 11 resources :photos do 12 resources :answers, only: [:create, :new] 13 end 14 resources :users, only: [:index, :show, :create] 15end 16

users/show/html.erbからphotos/show.html.erbに移動したいのですが、エラーが出てしまいうまくいきません。

######エラーメッセージ
イメージ説明

エラーメッセージ

ActionView::Template::Error (undefined method `id' for nil:NilClass): 1: <div class="container"> 2: <h2 style="text-align: center;"><%= @user.name %>の投稿一覧</h2> 3: <div class="center-block"> 4: <%= link_to "写真詳細ページ", photo_path(@photo.id) %> 5: <% @photos.each do |photo| %> 6: <div><a href="<%= photo_path %>">写真の詳細ページ</a></div> 7: <div style="border: 2px solid;"> app/views/users/show.html.erb:4:in `_app_views_users_show_html_erb___4171669809949038165_46961492423160'

###補足
原因はおそらくidが受け渡されてないからだと思いますが、どうやってもうまくいきません。
足りないコードがあれば載せます。
ご教授お願いします。

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

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

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

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

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

guest

回答2

0

重要なところだけ抜き出すと

def show
@user = User.find(params[:id])
@photos = @user.photos.order(id: :desc).page(params[:page])
end

および

<%= link_to "写真詳細ページ", photo_path(@photo.id) %>

<% @photos.each do |photo| %>

<div><a href="<%= photo_path %>">写真の詳細ページ</a></div>

見比べるとわかると思いますが@photoはコントローラー内で宣言されていないので使えません

erb

1 <% @photos.each do |photo| %> 2 <div><%= link_to "写真詳細ページ", photo_path(photo.id) %></div> 3 <div style="border: 2px solid;"> 4 <%= image_tag photo.image.url if photo.image? %> 5 <%= photo.content %> 6 </div> 7 <% end %>

投稿2021/04/23 22:56

asm

総合スコア15149

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

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

gen515

2021/04/23 23:00

コントローラーに@photo = Photo.find(params[:id])と宣言したのですが次はこのようなエラーが出ました。Couldn't find Photo with 'id'=3
asm

2021/04/23 23:11

そりゃ、UsersController#showに渡されるidはuserのものなのでPhotoから探してもみつからないでしょう
guest

0

@photoとは何でしょうか。

コントローラー内でこの値に何も代入していないので、値はnilです。

投稿2021/04/23 22:53

maisumakun

総合スコア146018

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

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

gen515

2021/04/23 23:00

コントローラーに@photo = Photo.find(params[:id])と宣言したのですが次はこのようなエラーが出ました。Couldn't find Photo with 'id'=3
maisumakun

2021/04/23 23:04

エラーメッセージのとおりです。UsersControllerに渡されるidはuserのidで、それでPhotoを引いても正しい結果は得られません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問