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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1060閲覧

rails No route matches{・・・:id=>nil}, missing required keys: [:id]

Junya421

総合スコア11

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/10/02 05:38

編集2019/10/02 06:24

前提・実現したいこと

画面上で
未完成、完成をupdateを使って切り替えられるようにしたいです。

:idをどうやったら持たせて、updateを行えますか?

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

No route matches {:action=>"update", :controller=>"microposts", :id=>nil}, missing required keys: [:id]

該当のソースコード

view index

ruby

1<% provide(:title, 'All users') %> 2<h1>All microposts</h1> 3 4<h2>検索</h2> 5<%= form_tag microposts_path, :method => 'get' do %> 6 <p> 7 <%= text_field_tag :search, params[:search] %> 8 <%= submit_tag "Search", :name => nil %> 9 </p> 10<% end %> 11 12 13<%= paginate @microposts %> 14<ul class="microposts"> 15 <%= render @microposts %> 16 17 18</ul>

view render

ruby

1<%= form_for(@micropost, url: micropost_path(@micropost), html: {method: "patch"}) %> 2 3 4 <% if micropost.flag == 0 %> 5 <%= hidden_field_tag :flag, 1 %> 6 <%= submit_tag "未達成", :name => nil %> 7 <% else %> 8 <%= hidden_field_tag :flag, 0 %> 9 <%= submit_tag "完了", :name => nil %> 10 <% end %>

controller

ruby

1def update 2 @micropost = Micropost.find(params[:id]) 3 if @micropost.update_attributes(micropost_params) 4 flash[:success] = "updated" 5 redirect_to @microposts 6 else 7 render 'home' 8 end 9 end

routes

ruby

1resources :microposts, only: [:create,:destroy,:index,:edit,:update]

試したこと

ruby

1<%= form_for(@micropost, url: micropost_path(@micropost), html: {method: "patch"}) %>

この記述方法を変えて、idを持たせることができれば変えられると
考えてそのやり方を調べたのですが、見つかりませんでした。

エラーメッセージで検索もしたのですが、

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

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

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

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

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

Mugheart

2019/10/02 05:58

controllerのコードですが、updateでなくviewに該当するメソッド(editですかね...?)を提示してほしいです。
Junya421

2019/10/02 06:01

edit は作ってないです! 一つのviewのなかで、todoアプリみたいに、完了、未完了を1clickで変更できるようにしたいです! お願いします!
Mugheart

2019/10/02 06:17

えーと、editがあるかどうかの話ではなくて、viewに該当するメソッド部分を提示してほしいという話です。
Junya421

2019/10/02 06:22

これですかね? def index if params[:search] == nil @microposts = Micropost.page(params[:page]).per(10) else search = params[:search] @microposts = Micropost.where(['name LIKE ?', "%#{search}%"]).page(params[:page]).per(10) end end
Mugheart

2019/10/02 06:28

質問自体を修正してください
guest

回答1

0

ベストアンサー

提示していただいたコードを見てわかる通り@micropostは定義されていないのでnilになっています。
render @micropostsとしているようなので@micropostでなくmicropostを使いましょう。

##余談

render @micropostsrender partial: 'microposts/micropost', collection: @micropostsの省略です。
そもそも省略形であることや、省略前のコードが何を意味しているか理解できていますか?
よくわかっていなければ押さえておいたほうがいいです。

投稿2019/10/02 06:28

編集2019/10/02 06:33
Mugheart

総合スコア2340

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

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

Junya421

2019/10/02 06:33 編集

<%= form_for(micropost, url: micropost_path(micropost), html: {method: "patch"}) %> これでも、エラーが出てしまいます。 Missing block
Junya421

2019/10/02 06:37 編集

省略なのはわかっていますが、意味まではわからないです。 collectionとはどういったいみでしょうか。
Mugheart

2019/10/02 06:37

> Missing block do がないからです。文法エラーですよ。
Junya421

2019/10/02 06:39

文法エラーだったんですね! できました!  また次のえらー出ちゃいましたけど、次に進めました! ありがとうございます!
Mugheart

2019/10/02 06:41

> collectionとはどういったいみでしょうか。 自分で調べた上で質問してください。 例えばこことか読んでみるといいんじゃないでしょうか。 https://apidock.com/rails/ActionView/Partials
Mugheart

2019/10/02 06:42

はい、よかったです。頑張ってください。
Junya421

2019/10/02 06:49

パーシャルはデータの繰り返し (コレクション) を出力する場合にもきわめて便利です。:collectionオプションを使用してパーシャルにコレクションを渡すと、コレクションのメンバごとにパーシャルがレンダリングされて挿入されます。 こんな感じの意味が出てきたんですが、わからないですね、
Mugheart

2019/10/02 06:58

コレクションというのが@micropostsにあたり、メンバというのが@micropostsの要素それぞれにあたります。 動きがわからないのであれば、先ほどあげたURLにそのまま書いてあります。 <%= render :partial => "ad", :collection => @advertisements %> This will render “advertiser/_ad.erb” and pass the local variable ad to the template for display. advertiser/_ad.erb が レンダリングされ、その時 ad というローカル変数が渡されます。と書いてあります。この ad に当たるのが メンバ になるわけですが、理解できますでしょうか。 もっとわかりやすくいうのであれば @microposts.each do |micropost| render partial: 'microposts/micropost', local: { micropost: micropost } end をしているのと同じ結果になるということです。 これも同じようなことがURL先のページに書かれています。
Junya421

2019/10/02 07:03

あの英語全部読んでるんですか?すごいですね、、 説明ありがとうございます! ただやっぱり、はっきりとはわからないです。書いてくださったことはわかるんですが、 あ!ちなみにやりたかったことはできました!完了です。
Junya421

2019/10/02 07:07

あの、なんどもすいません。 どうして@micropostではなく、micropostだと動くんでしょうか。 <%= form_for(@user) do |f| %> これとはどう違いますか?
Mugheart

2019/10/02 07:16

@micropostが定義されているのであれば動きます。 回答にも書いてある通り@micropostは定義されていないので動いていないだけです。 <%= form_for(@user) do |f| %> <%= form_for(micropost) do |f| %> この2つのやっていることは全く同じです。 たまにform_forに渡す変数は必ずインスタンス変数でなければいけないとか 勘違いしている人もいますが、全く違います。 重要なのは変数の中身がなんなのかです。 ローカル変数かインスタンス変数かどんな変数名なのかは全く重要ではありません。 質問の意図が汲み取れなかったのでやや広義な説明をしましたがこんなところです。
Junya421

2019/10/02 07:24

なるほどです。 定義している場所を見比べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問