0

当我单击 upvote 时出现错误,请 在此处输入图像描述

这是我的路线.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 中显示 myurl.com/posts/%23/like 我认为这意味着它没有获得 id,我该如何解决?这真的让我筋疲力尽,提前谢谢

编辑:我用 x 替换了@post,因为我使用了一个循环,它修复了 url,但仍然得到相同的错误,即无法找到没有 ID 的帖子。

4

1 回答 1

0

如果您传递帖子的 id,因为 like 是帖子的成员(子),链接应该看起来像 /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_to like_post_path(@post), method: :put, class: 'upvote' do %>

你在看教程吗?在 Rails 4 中不建议使用 find_by_id。您是创建自己的身份验证还是使用 gem?

更新 2

在引用集合时使用单数名称不是 Rails 约定(因此我假设您之前与 @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 %> 
于 2016-04-13T13:59:43.560 回答