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

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

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

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

Q&A

1回答

162閲覧

missing required keys: [:id]が解決できないです

pochi13

総合スコア1

Ruby on Rails 6

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

1グッド

1クリップ

投稿2021/08/31 04:46

編集2021/08/31 05:06

現在以下のエラーで詰まっております。尚、favariteのスペルは誤字となります。
ActionController::UrlGenerationError

実際に指摘をされている箇所

No route matches {:action=>"destroy", :blog_id=>#<Blog id: 7, user_id: 2, title: "aaa", body: "aaaa", image_id: "9006d95ab6ed9a6c4dd1879a726a47d24dbfde03cb40daae57...", created_at: "2021-08-30 07:53:35", updated_at: "2021-08-30 07:53:35">, :controller=>"favarites"}, missing required keys: [:id]

### controller
def create
@favatrite = current_user.favarites.create(blog_id: params[:blog_id])
redirect_back(fallback_location: root_path)
end

def destroy
@blog = Blog.find(params[:blog_id])
@favatrite = current_user.favarites.find_by(blog_id: @blog.id)
@favatrite.destroy
redirect_back(fallback_location: root_path)
end

routes.rb

devise_for :users
root to: "home#index"
resources :users
resources :blogs do
resources :favarites, only: [:create, :destroy]
resources :comments, only: [:create,:destroy]
collection do
get 'search'
end
end

favarite model

class Favarite < ApplicationRecord
belongs_to :user
belongs_to :blog
varidates_uniqueness_of :blog_id, scope: :user_id
end

blogs_controller

def index
@blogs = Blog.order(id: "DESC")
end

### user model
class User < ApplicationRecord
has_many :blogs, dependent: :destroy
has_many :comments, dependent: :destroy
has_many :favarites, dependent: :destroy

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
attachment :profile_image

validates :username, presence: true def already_favarited?(blog) self.favarites.exists?(blog_id: blog.id) end

end

rails routes

blog_favarites POST /blogs/:blog_id/favarites(.:format) favarites#create
blog_favarite DELETE /blogs/:blog_id/favarites/:id(.:format) favarites#destroy

blog:index.heml.erb

<div class = "container"> <% @blogs.each do |blog|%> <%= link_to blog_path(blog) do %> <%= attachment_image_tag blog, :image %><br> <% end %> <%= link_to user_path(blog.user.id) do %><br> <%= attachment_image_tag blog.user, :profile_image ,fallback: "no-image.png" %><br> <% end %> <%= link_to blog.user.username,user_path(blog.user.id) %><br> <%= blog.updated_at.strftime("%Y-%m-%d %H:%M") %>更新<br>

<% if current_user.already_favarited?(blog) %>
<%= link_to blog_favarite_path(blog), method: :delete do %>
<i class="fas fa-heart"></i>
<% end %>
<% else %>
<%= link_to blog_favarites_path(blog), method: :post do %>
<i class="far fa-heart"></i>
<% end %>
<%= blog.favarites.count %>
<% end %>
<% end %>

<div> ###

blogの中にkeyも入っているのとrouteもおかしくはないと思ったのですが、どうすれば解決に至るのでしょうか?
お分かりの方がいらしたらご教授のほどよろしくお願いいたします。

shinoharat👍を押しています

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

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

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

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

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

guest

回答1

0

rails routes が

blog_favarite DELETE /blogs/:blog_id/favarites/:id(.:format)

になっているのが分かりますか?
favarite を削除する場合、 blog_id と id の2つのパラメータが必要になります。

[NG] <!-- どの favarite を削除すればよいか分からないのでエラーになる --> ​<%= link_to blog_favarite_path(blog), method: :delete do %>
[OK] <!-- blog に含まれる特定の favarite を削除する --> <%= link_to blog_favarite_path(blog, favarite), method: :delete do %>

参考URL
Rails のルーティング - 2.7 ネストしたリソース | Rails ガイド
Rails のルーティング - 2.9 オブジェクトからパスとURLを作成する | Rails ガイド

--

ただ、提示されたコードを見る限り、 もしかして blog と favarite は 1対1 の関係なんですかね? favarite の削除時に特定の id の指定は不要っぽいですね。

もしそうなら、routes.rb の方を以下のように変えれば、削除時に特定の favarite を指定する必要が無くなります。

diff

1 devise_for :users 2 root to: "home#index" 3 resources :users 4 resources :blogs do 5- resources :favarites, only: [:create, :destroy] 6+ resource :favarite, only: [:create, :destroy] 7 resources :comments, only: [:create,:destroy] 8 collection do 9 get 'search' 10 end 11 end

参考URL
Rails のルーティング - 2.5 単数形リソース | Rails ガイド

※ この方法を選ぶ場合、リソース名が単数形に変わるので、 blog_favarites_path (複数形のURLヘルパー) はすべて blog_favarite_path (単数形) に置き換えてください。

投稿2021/08/31 06:40

編集2021/08/31 07:15
shinoharat

総合スコア1685

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

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

pochi13

2021/08/31 07:05

ありがとうございます。仰る通りresouecesをresoueceに変更することで無事解決しました。ちなみにblog と favarite は 1対多 の関係になり、blogmodelにはhas_many :favarites, dependent: :destroyを記述しております。
shinoharat

2021/08/31 07:09

> blog と favarite は 1対多 の関係 普通に考えればそうですね。。。。恥ずかしいことを書きました。 ともあれ、解決したようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問