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

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

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

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

Ruby

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

Q&A

1回答

422閲覧

特定の投稿を編集リンクから名前付きルート(edit_micropost_path)で編集画面へ飛ばす際に、その投稿のidを渡す方法

tahataha

総合スコア7

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/07/05 08:07

前提・実現したいこと

初歩的な質問で恐縮です。
railsチュートリアルのサンプルアプリにて投稿した文章を編集できる機能を実装しようとしています。
編集画面のビューを用意し、editアクションをコントローラに記載して、link_toメソッドでedit_micropost_pathを使って編集画面に飛ばそうとしています。

ですが現在編集のリンク自体は投稿のフィードに正常に表示されますが、そのリンクをクリックして飛ぼうとしたところで下記のエラーが発生します。

発生している問題・エラーメッセージ

下記のように、micropostのidを取得できないと怒られこけております。

ActiveRecord::RecordNotFound in MicropostsController#edit Couldn't find Micropost without an ID

該当のソースコード

_micropost.html.erb

ruby

1<li id="micropost-<%= micropost.id %>"> 2 <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> 3 <span class="user"><%= link_to micropost.user.name, micropost.user %></span><br> 4 <span class="title"><strong><%= micropost.title %></span></strong><br> 5 <span class="content"> 6 <%= micropost.text %><br> 7 <%= image_tag micropost.picture.url if micropost.picture? %><br> 8 <%= micropost.tag %><br> 9 </span> 10 <span class="timestamp"> 11 Posted <%= time_ago_in_words(micropost.created_at) %> ago. 12 <% if current_user?(micropost.user) %> 13 <%= link_to "編集" , edit_micropost_path(:id) %> 14 15 <%= link_to "削除", micropost, method: :delete, 16 data: { confirm: "You sure?" } %> 17 <% end %> 18 </span> 19 <%= render "likes/like", micropost: micropost %> 20 <%= render "joins/join", micropost: micropost %> 21</li>

edit.html.erb

<% provide(:title, "Edit micropost") %> <h1>プロジェクトを編集する</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_for(@micropost) do |f| %> <%= render 'shared/error_messages' %> <%= f.label :title %> <%= f.text_field :title, class: 'form-control' %> <%= f.label :text %> <%= f.text_field :text, class: 'form-control' %> <%= f.label :tag %> <%= f.text_field :tag ,class: 'form-control' %> <%= f.submit "変更を保存する", class: "btn btn-primary" %> <% end %> <div class="gravatar_edit"> <%= gravatar_for @user %> <a href="http://gravatar.com/emails" target="_blank">変更</a> </div> </div> </div>

miropost_controller.rb

class MicropostsController < ApplicationController before_action :logged_in_user, only: [:create, :destroy] before_action :correct_user, only: :destroy def index @search_microposts = Micropost.search(params[:search]) end def readyfor @micropost = current_user.microposts.build if logged_in? end def create @micropost = current_user.microposts.build(micropost_params) if logged_in? if @micropost.save flash[:success] = "Micropost created!" redirect_to root_url else @feed_items = current_user.feed.paginate(page: params[:page]) render 'static_pages/home' end end def destroy @micropost.destroy flash[:success] = "Micropost deleted" redirect_to request.referrer || root_url end def edit @micropost = Micropost.find(params[:micropost_id]) end def update @micropost = Micropost.find(params[:id]) if @micropost.update_attributes(micropost_params) #実装中の部分 else render 'edit' end end private def micropost_params params.require(:micropost).permit(:text, :tag, :title) end def correct_user @micropost = current_user.microposts.find_by(id: params[:id]) redirect_to root_url if @micropost.nil? end end

routes.rb

Rails.application.routes.draw do get 'joins/create' get 'joins/destroy' get 'likes/create' get 'likes/destroy' get 'password_resets/new' get 'password_resets/edit' get 'sessions/new' root "static_pages#home" get "/readyfor", to: "microposts#readyfor" post "/readyfor", to: "microposts#create" get '/about', to: 'static_pages#about' get "/discover", to: "static_pages#discover" get '/signup', to: 'users#new' post '/signup', to: 'users#create' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do # /users/:id/~ get :following, :followers # GET /users/1/following => following action # GET /users/1/followers => followers action end end resources :account_activations, only: [:edit] resources :password_resets, only: [:new, :create, :edit, :update] resources :microposts resources :relationships, only: [:create, :destroy] resources :likes, only: [:create, :destroy] resources :joins, only: [:create, :destroy] end

試したこと

当初はedit_micropost_pathに引数でidを渡しておらず、リクエストのなかの投稿のidがnilだと怒られていました。パスに与えるidやコントローラのeditアクションの引数のidなどの表記を変えたりしましたが、依然解決できません。

お力をお貸しいただけると幸いです、、!

補足情報(FW/ツールのバージョンなど)

ruby 2.4.1
ruby on rails 5.1.4

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

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

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

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

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

guest

回答1

0

controllerのedit部分を

ruby

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

に変更して、_micropost.html.erbの「link_to '編集'」の部分を

html

1<%= link_to "編集" , edit_micropost_path(@micropost) %>

としてみたらどうでしょうか?

投稿2018/07/06 12:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tahataha

2018/07/07 09:00

回答ありがとうございます! 頂いたアドバイスを実行してみました。 するとmicropostのfeed画面を表示させる際に ActionController::UrlGenerationError in StaticPages#home No route matches {:action=>"edit", :controller=>"microposts", :id=>nil}, missing required keys: [:id] と表示されidが見つからないとのことで怒られるようになりました。。 名前付きルートの存在は確認済みなのですが、こちら原因わかりますでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/09 08:36

https://teratail.com/questions/50946 こちらに似たような質問と解決策が載っていて、エラーの読み解き方も丁寧に書かれています! 一度参考にして見て、わからなかったら再度コメントください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問