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:
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
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 –
Heureux que ça marche. _Happy coding! _ –