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

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

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

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

Ruby

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

受付中

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

tahataha
tahataha

総合スコア0

Ruby on Rails 5

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

Ruby

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

1回答

0評価

0クリップ

19閲覧

投稿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

<li id="micropost-<%= micropost.id %>"> <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> <span class="user"><%= link_to micropost.user.name, micropost.user %></span><br> <span class="title"><strong><%= micropost.title %></span></strong><br> <span class="content"> <%= micropost.text %><br> <%= image_tag micropost.picture.url if micropost.picture? %><br> <%= micropost.tag %><br> </span> <span class="timestamp"> Posted <%= time_ago_in_words(micropost.created_at) %> ago. <% if current_user?(micropost.user) %> <%= link_to "編集" , edit_micropost_path(:id) %> <%= link_to "削除", micropost, method: :delete, data: { confirm: "You sure?" } %> <% end %> </span> <%= render "likes/like", micropost: micropost %> <%= render "joins/join", micropost: micropost %> </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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 5

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

Ruby

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