缺少必需的键:[:like_id]

时间:2015-01-09 08:17:22

标签: ruby-on-rails ruby ruby-on-rails-4

我无法在我的Rails讨论论坛中使用类似的系统:

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :comment
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
  has_many :likes, through: :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
  has_many :likes
end

routes.rb中:

resources :posts do
  resources :comments do
    resources :likes do
      put "/create", to: "likes#create"
    end
  end
end

likes_controller.rb:

class LikesController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = Comment.find(params[:comment_id])
    @like = Like.find(params[:like_id])
    @user = current_user.id

    Like.create(like_id: @like, post_id: @post, comment_id: @comment, user_id: @user)

    respond_to do |format|
      format.html { redirect_to post_path(@post) }
    end
  end
end

佣金路线:

post_comment_like_create PUT    /posts/:post_id/comments/:comment_id/likes/:like_id/create(.:format) likes#create
      post_comment_likes GET    /posts/:post_id/comments/:comment_id/likes(.:format)                 likes#index
                         POST   /posts/:post_id/comments/:comment_id/likes(.:format)                 likes#create
etc

我遇到的问题是缺少like_id:

No route matches {:action=>"create", :comment_id=>"218", :controller=>"likes", :like_id=>nil, :post_id=>"30"} missing required keys: [:like_id]

我做错了什么?我假设大部分代码都是正确的,因为它给我的唯一错误是缺少ID,我只是不明白如何或在哪里获取like_id。

修改

这是我正在尝试使用的操作:

= link_to post_comment_like_create_path(@post, comment, @like)

1 个答案:

答案 0 :(得分:0)

问题部分在于您的路线,部分在您的控制器中,部分在视图中。

通过使用行resources :likes,您将自动为7个CRUD操作创建路由。这意味着您不需要在路由中手动声明create操作(应该是POST而不是PUT)。我建议阅读Rails Guide on Routing

在您的控制器中,您正尝试通过根据ID查找@like来创建名为Like的对象。但是你是第一次创造这个,所以没有什么可以找到的。

在您看来,您不应该使用link_to来处理影响数据库的任何内容,而应使用button_to,而您正在使用的路径也是问题的一部分。

进行以下更改:

<强>的routes.rb

resources :posts do
  resources :comments do
    resources :likes
  end
end

<强> likes_controller.rb

class LikesController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = Comment.find(params[:comment_id])
    @user = current_user.id

    Like.create(post_id: @post, comment_id: @comment, user_id: @user)

    respond_to do |format|
      format.html { redirect_to post_path(@post) }
    end
  end
end

查看

= button_to post_comment_likes_path(@post, comment)

我建议你看一下路线筑巢的指南。嵌入这么深可能很容易变得麻烦。