2016-04-13 10 views
0

Wenn ich auf upvote Ich erhalte einen Fehler enter image description hereWarum funktioniert meine Arbeit nicht als votable?

Heres meiner 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 

Und meine 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 

Und ich in meinem Index

<%= link_to like_post_path(@post), method: :put, class: 'upvote' do %> 

In der URL es s zeigt myurl.com/posts/%23/like Ich denke, das bedeutet, es ist nicht die ID, wie kann ich es beheben? Diese ist buchstäblich anstrengend ich, danke im voraus

EDIT: I ersetzt @post mit x, da ich eine Schleife wurde mit, dass die URL fest, aber immer noch die gleichen Fehler, das ist Könnte Beitrag nicht ohne ID finden .

Antwort

0

Wenn Sie die ID der Post übergeben, da wie ein Mitglied ist (Kind) eines Post, sollte der Link aussehen/posts/41/wie

Als nächstes sollten Sie die .exists entfernen? Teil vom Controller. So etwas gehört nur in das Modell.

aktualisieren

Ihr Controller sollte wie folgt aussehen:

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 

Und Ihre Ansicht Link

<%= link_to like_post_path(@post), method: :put, class: 'upvote' do %> 

Sie ein Tutorial Im folgenden werden? find_by_id wird nicht in Rails 4 vorgeschlagen. Haben Sie Ihre eigene Authentifizierung erstellt oder verwenden Sie einen Edelstein?

Update 2

Es ist nicht Schienen Konvention einen einzigartigen Namen zu verwenden, wenn zu einer Sammlung (also meine Vermutung über Ihre frühere Verbindung mit @post) Bezug genommen wird. Also, wenn Sie versuchen, auf Ihre Post Indexseite wählen, dann sollten Sie Ihre Beiträge Controller

def index 
    @posts = Post.all 
end 

Und Ihre Ansicht Schleife

<%= @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 %> 

+0

noch einen Fehler bekommen wäre, ja ich verwende ersinnen Juwel und ein Tutorial –

+0

hmm ... Sie sollten nicht die URL in der Verbindung zu sehen. Lassen Sie mich etwas überprüfen – trh

+0

Ich erstellte eine App, fügte einen Benutzer hinzu, verwendete Ihren Link, Ihren Controller und Ihre Routen, und es funktioniert gut. Haben Sie vergessen, dass der Server nach der Aktualisierung möglicherweise nicht neu gestartet wurde? – trh