我无法在我的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)
答案 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)
我建议你看一下路线筑巢的指南。嵌入这么深可能很容易变得麻烦。