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

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

ただいまの
回答率

90.50%

  • Ruby

    7677questions

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

  • Ruby on Rails 5

    1771questions

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 89

tahataha

score 1

 前提・実現したいこと

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

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

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

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

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

 該当のソースコード

_micropost.html.erb

<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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

controllerのedit部分を

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


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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/07 18: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 17:36

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

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

    前提・実現したいこと 他モデルへのshowページへ飛べるように条件分岐をしたいです。 例えば、あるユーザーがUserとしてログインしていたとします。 そこから、Shopユ

  • 解決済

    他モデル間フォローでのajax実装方法とは?Part2

    前提・実現したいこと 他モデル間でのいいね!機能にajaxを実装したい。 二度目のajaxの質問で大変恐縮です。 いいね!をするまでの流れとしては Userログイン→S

  • 解決済

    name spaceを使ったrootのパスが表示されない

    以下の通り、管理者画面のTopページを別レイアウトにする為に、name spaceを使用してroutesを設定しています。name space内の他のrouteは想定通りにpath

  • 解決済

    stack level too deepのエラーを解決したい

    前提・実現したいこと ツイッターライクなマイクロソフトを投稿できるサービスを作成しています。 Railsアプリケーションで発生しているタイトルのエラーを解消したいと思っています

  • 解決済

    Railsの非同期通信でいいね機能が反映されるようにしたい

    ●実現したいこと 現在、ユーザーの作品を投稿できるInstagramのようなサイトを作成しています。 その中で、作品に「いいね」が押せるように機能を追加しようとしているので

  • 解決済

    Rails5で投稿に「いいね」機能を実装

    前提・実現したいこと Railsチュートリアルを一通り終え、micropostに「いいね」機能の拡張を実装中です。 しかし、「いいね」の取り消しができません。お力添えいただけると助

  • 解決済

    RailsでAjaxをちゃんと動かしたい

    Railsでrailsとjsを使ったお手軽「いいね♡機能」をみながら、「いいね♡機能」を実装しているのですが、[いいね!ボタン]を押したあとにリロードしなければ画面が変化しません。

  • 解決済

    rails5でのcarrierwaveを用いた画像投稿機能の実装でのエラー

    プログラミング初心者です。現在progateなどを参考にしながらツイッターのようなSNSを実装しています。 herokuでの公開に向けてユーザのプロフィール画像の投稿をcarrie

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

  • Ruby

    7677questions

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

  • Ruby on Rails 5

    1771questions

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