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

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

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

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

Q&A

解決済

1回答

1897閲覧

Rails Tutorial 第2章の演習で躓いております。

AlchoCat

総合スコア7

Ruby on Rails

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

0グッド

1クリップ

投稿2017/11/05 13:27

###前提・実現したいこと
Railsの勉強をしております。
Rails Tutorial の第2章 2.3.3 演習1にてつまづいております。

###発生している問題・エラーメッセージ
http://*******/users/1 にアクセスした際に、
Micropost内のユーザーIDに紐づいた最初のPostを表示したいです。

他サイトで記載されているサンプル通りに設定しておりますが、
Couldn't find Micropost with 'id'=11

@user = User.find(params[:id]) p = "@Micropost.find(params[:id])" @micropost = Micropost.find(params[:id]) ★この行でエラーが出ます。 end

###該当のソースコード
■micropost.rb

class Micropost < ApplicationRecord belongs_to :user validates :content, length: { maximum: 140 } end

■user.rb

class User < ApplicationRecord has_many :microposts end

■show.html.erb

<p id="notice"><%= notice %></p> <p> <strong>Name:</strong> <%= @user.name %> </p> <p> <strong>Email:</strong> <%= @user.email %> </p> <p> <strong>Content:</strong> <%= @micropost.content %> </p> <%= link_to 'Edit', edit_user_path(@user) %> | <%= link_to 'Back', users_path %>

■users_controller.rb

class UsersController < ApplicationController before_action :set_user, only: [:show, :edit, :update, :destroy] # GET /users # GET /users.json def index @users = User.all end # GET /users/1 # GET /users/1.json def show end # GET /users/new def new @user = User.new end # GET /users/1/edit def edit end # POST /users # POST /users.json def create @user = User.new(user_params) respond_to do |format| if @user.save format.html { redirect_to @user, notice: 'User was successfully created.' } format.json { render :show, status: :created, location: @user } else format.html { render :new } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # PATCH/PUT /users/1 # PATCH/PUT /users/1.json def update respond_to do |format| if @user.update(user_params) format.html { redirect_to @user, notice: 'User was successfully updated.' } format.json { render :show, status: :ok, location: @user } else format.html { render :edit } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # DELETE /users/1 # DELETE /users/1.json def destroy @user.destroy respond_to do |format| format.html { redirect_to users_url, notice: 'User was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_user @user = User.find(params[:id]) @micropost = Micropost.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def user_params params.require(:user).permit(:name, :email) end end

###試したこと
記述の方法が違うのかと思い、いくつか試しましたが
なぜMicropostからIDが見つからないのかわかりませんでした。

user_idではなく、POSTのIDで探している場合は、
POST数<user_idなので見つからないのかもしれません。

単に

@micropost = Micropost.find(params[:id])

と記載していますが、この[:id]がuser_idを引っ張って
来てくれているのか、わかっていない部分です。

解決方法等、ご存じの方がいれば力を貸して頂けないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ActiveRecordの.findは、テーブルのIDを基準にデータを探す専用です。

user_idから探したければ、「.whereで検索条件を指定する」「has_manybelongs_toで関係を指定した上で、リレーションのメソッドを使って探す」など、別な手段が必要です。

投稿2017/11/05 22:17

maisumakun

総合スコア145121

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

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

AlchoCat

2017/11/06 14:41

ご回答ありがとうございます。 テーブルIDを基準に探す専用なのですね。 この表現では、ユーザ毎のPOSTを表示するのではなく、 単にユーザの作成順番とPOSTの投稿順番が紐づくだけだと理解しました。 また、代用方法までご教示頂いてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問