为什么我的行为没有发挥作用?
Why isn't my acts as votable working?
当我点击投票时出现错误
enter image description here
这是我的 routes.rb
Rails.application.routes.draw do
#root 'pages#index'
resources :posts
devise_for :users
# Define root URL
root 'pages#index'
# Define roots for pages
get '/home' => 'pages#home'
get '/user/:id' => 'pages#profile'
get '/explore' => 'pages#explore'
resources :posts do
member do
put "like", to: "posts#upvote" # maybe change it to POSTS??
put "dislike", to: "posts#downvote" # maybe change it to POSTS??
end
end
还有我的posts_controller.rb
class PostsController < ApplicationController
#resources posts
def new
@post = current_user.posts.build
end
def index
@post = Post.all
end
def show
@post = Post.find(params[:id])
end
def create
@user = User.find(session[:user_id])
@post = current_user.posts.build(permit_post)
if @post.save
flash[:success] = "Uploaded"
redirect_to '/'
else
flash[:error] = @posts_errors_full_messages
end
end
def upvote
current_user = User.find_by_id(session[:user_id])
@post = Post.find(params[:id])
current_user.upvotes @post
redirect_to :back
end
def downvote
@post = Post.find(params[:id])
@post.downvote_by current_user
redirect_to :back
end
private
def permit_post
params.require(:post).permit(:image, :title);
end
end
我的索引中有
<%= link_to like_post_path(@post), method: :put, class: 'upvote' do %>
在 URL 它显示我的url.com/posts/%23/like
我认为这意味着它没有获得 id,我该如何解决?
这真的让我筋疲力尽,提前致谢
编辑:
我用 x 替换了 @post 因为我使用了一个循环,修复了 url 但仍然得到相同的错误,即没有 ID 找不到 Post。
如果传递 post 的 ID,因为 like 是 post 的成员(子),link 应该类似于 /posts/41/like
接下来,您应该删除 .exists?从控制器的一部分。那种东西只属于模型
更新
您的控制器应该看起来更像:
def upvote
# current_user = User.find_by_id(session[:user_id]) -- since you use devise, you don't need this
@post = Post.find(params[:id])
current_user.upvotes @post
redirect_to :back
end
还有你的观点link
<%= link_to like_post_path(@post), method: :put, class: 'upvote' do %>
您在学习教程吗? find_by_id 在 Rails 中不建议使用 4. 您是创建了自己的身份验证还是使用了 gem?
更新 2
在引用集合时使用单数名称不是 rails 惯例(因此我假设您之前的 link 和 @post)。因此,如果您尝试在 post 索引页上投票,那么您的 post 控制器应该是
def index
@posts = Post.all
end
你的视图循环将是
<%= @posts.each do |post|
<!-- Other view code here for what you want to display >
<%= link_to like_post_path(post), method: :put, class: 'upvote' do %>
<% end %>
我遇到了同样的问题,我尝试了 button_to
而不是 link_to
,它成功了。
当我点击投票时出现错误 enter image description here
这是我的 routes.rb
Rails.application.routes.draw do
#root 'pages#index'
resources :posts
devise_for :users
# Define root URL
root 'pages#index'
# Define roots for pages
get '/home' => 'pages#home'
get '/user/:id' => 'pages#profile'
get '/explore' => 'pages#explore'
resources :posts do
member do
put "like", to: "posts#upvote" # maybe change it to POSTS??
put "dislike", to: "posts#downvote" # maybe change it to POSTS??
end
end
还有我的posts_controller.rb
class PostsController < ApplicationController
#resources posts
def new
@post = current_user.posts.build
end
def index
@post = Post.all
end
def show
@post = Post.find(params[:id])
end
def create
@user = User.find(session[:user_id])
@post = current_user.posts.build(permit_post)
if @post.save
flash[:success] = "Uploaded"
redirect_to '/'
else
flash[:error] = @posts_errors_full_messages
end
end
def upvote
current_user = User.find_by_id(session[:user_id])
@post = Post.find(params[:id])
current_user.upvotes @post
redirect_to :back
end
def downvote
@post = Post.find(params[:id])
@post.downvote_by current_user
redirect_to :back
end
private
def permit_post
params.require(:post).permit(:image, :title);
end
end
我的索引中有
<%= link_to like_post_path(@post), method: :put, class: 'upvote' do %>
在 URL 它显示我的url.com/posts/%23/like 我认为这意味着它没有获得 id,我该如何解决? 这真的让我筋疲力尽,提前致谢
编辑: 我用 x 替换了 @post 因为我使用了一个循环,修复了 url 但仍然得到相同的错误,即没有 ID 找不到 Post。
如果传递 post 的 ID,因为 like 是 post 的成员(子),link 应该类似于 /posts/41/like
接下来,您应该删除 .exists?从控制器的一部分。那种东西只属于模型
更新
您的控制器应该看起来更像:
def upvote
# current_user = User.find_by_id(session[:user_id]) -- since you use devise, you don't need this
@post = Post.find(params[:id])
current_user.upvotes @post
redirect_to :back
end
还有你的观点link
<%= link_to like_post_path(@post), method: :put, class: 'upvote' do %>
您在学习教程吗? find_by_id 在 Rails 中不建议使用 4. 您是创建了自己的身份验证还是使用了 gem?
更新 2
在引用集合时使用单数名称不是 rails 惯例(因此我假设您之前的 link 和 @post)。因此,如果您尝试在 post 索引页上投票,那么您的 post 控制器应该是
def index
@posts = Post.all
end
你的视图循环将是
<%= @posts.each do |post|
<!-- Other view code here for what you want to display >
<%= link_to like_post_path(post), method: :put, class: 'upvote' do %>
<% end %>
我遇到了同样的问题,我尝试了 button_to
而不是 link_to
,它成功了。