0

J'ai terminé un cours Udemy sur la création d'une application Blog dans Rails. J'ai ajouté la fonctionnalité JSON pour la visualisation des articles sur mobile et pour l'inscription/la connexion. Tout fonctionne.agit comme des rails votables ActiveRecord :: RecordNotFound et NoMethodError dans ArticlesController

Mon prochain problème est que je veux ajouter des upvotes et des downvotes afin que les utilisateurs connectés puissent voter sur les articles.

J'ai installé gem acts_as_votable et a suivi une tute (http://www.mattmorgante.com/technology/votable) comment mettre en œuvre mais je reçois les erreurs suivantes lorsqu'un utilisateur clique sur upvote/downvote: ActiveRecord :: RecordNotFound ou NoMethodError dans ArticlesController

I Je suppose que la première erreur est parce que le contrôleur d'article sait déjà de quel article je parle quand je clique sur upvote? Donc je l'ai commenté pour downvote_by et il ne connait pas la méthode downvote_by

Qu'est-ce que j'ai raté? Appréciez l'aide. Merci.

Si je clique Upvote:

enter image description here

Si je clique downvote: enter image description here

articles contrôleur:

class ArticlesController < ApplicationController 
    before_action :authenticate_user!, :except => [:index, :show] 
    before_filter :set_article, only: [:show, :edit, :update, :destroy] 

    def index 
    @articles = Article.all 
    end 

    def new 
    @article = Article.new 
    end 

    def create 
    @article = current_user.articles.build(article_params) 
    if @article.save 
     flash[:success] = "Article has been created" 
     redirect_to articles_path 
    else 
     flash.now[:danger] = "Article has not been created" 
     render :new 
    end 
    end 

    def edit 
    if @article.user != current_user 
     flash[:danger] = "You can only edit your own article" 
     redirect_to root_path 
    end 
    end 

    def update 
    if @article.user != current_user 
     flash[:danger] = "You can only edit your own article" 
     redirect_to root_path 
    else 
     if @article.update(article_params) 
      flash[:success] = "Article has been updated" 
      redirect_to @article 
     else 
     flash.now[:danger] = "Article has not been updated" 
     render :edit 
     end 
    end 
    end 

    def show 
    @comment = @article.comments.build 
    end 

    def destroy 
    if @article.destroy 
     flash[:success] = "Article has been deleted" 
     redirect_to articles_path 
    end 
    end 
    def upvote 
    @article=Article.find(params[:id]) 
    @article.upvote_by current_user 
    flash[:success] = "Successfully liked" 
    respond_to do |format| 
     format.html {redirect_to articles_path } 
     format.json { render json: { count: @article.liked_count } } 
    end 
    end 
    def downvote 
    #@article = Article.find(params[:id]) 
    @article.downvote_by current_user 
    flash[:success] = "Successfully disliked" 
    respond_to do |format| 
     format.html {redirect_to articles_path } 
     format.json { render json: { count: @article.disliked_count } } 
    end 
    end 

    private 
    def article_params 
     params.require(:article).permit(:title, :body) 
    end 

    def set_article 
    @article=Article.find(params[:id]) 
    end 
end 

fichier show.html.erb qui concerne les goûts/n'aime pas:

<div class="article-body"> 
<%= link_to article_like_path(@article), method: :put do %> 
    Upvote 
    <%= @article.get_upvotes.size %> 
<% end %> 
<%= link_to article_dislike_path(@article), method: :put do %> 
    Downvote 
    <%= @article.get_downvotes.size %> 
<% end %> 

Article Modèle:

class Article < ActiveRecord::Base 
    validates :title, presence: true 
    validates :body, presence: true 

    belongs_to :user 
    acts_as_votable 
    has_many :comments, dependent: :destroy 

    default_scope { order(created_at: :desc)} 
end 

fichier itinéraires:

Rails.application.routes.draw do 

    devise_for :users, :controllers => {registrations: "registrations", sessions: "sessions", :omniauth_callbacks => "callbacks"} 
    # The priority is based upon order of creation: first created -> highest priority. 
    # See how all your routes lay out with "rake routes". 

    #namespace :api, defaults: {format: :json} do 
    # scope :v1 do 
    # mount_devise_token_auth_for 'User', at: 'auth', skip: [:omniauth_callbacks] 
     # :controllers => { :sessions => "api/v1/sessions" }, 
    # end 
    #end 

    # You can have the root of your site routed with "root" 
    root to: 'articles#index' 
    resources :articles do 
    put "like", to: "articles#upvote" 
    put "dislike", to: "articles#downvote" 
    resources :comments 
    end 
    end 

enter image description here

Répondre

1

Retirez cette ligne de code de upvote et downvote actions dans votre contrôleur:

@article = Article.find(params[:id]) 

montre les espaces entre le signe égal

Modifier votre before_filter à ceci:

before_action :set_article, only: [:show, :edit, :update, :destroy, :upvote, :downvote] 

Vos itinéraires doivent être:

resources :articles do 
    member do 
    put "like", to: "articles#upvote" 
    put "dislike", to: "articles#downvote" 
    end 
    resources :comments 
end 
+0

Champ! merci tas. Dans mon show.html.erb je devais changer les chemins pour: <% = link_to like_article_path et <% = link_to dislike_article_path –

+0

Heureux que ça marche. _Happy coding! _ –