2015-05-18 2 views
1

я получаю следующее сообщение об ошибке, когда upvoting или вниз голосования мой пост:Получить Маршруты Сломанный

Routing Error 
No route matches [GET] "/posts/181/up-vote" 

Избиратель Частичное:

<% if policy(Vote.new).create? %> 
     <div class="vote-arrows pull-left"> 
     <div> 
      <%= link_to " ", 
      post_up_vote_path(post), 
      class: "glyphicon glyphicon-chevron-up #{(current_user.voted(post) && current_user.voted(post).up_vote?) ? 'voted' : '' }", method: :post do %> 
     </div> 
     <div> 
      <strong><%= post.points %></strong> 
     </div> 
     <div> 
      <%= link_to " ", 
      post_down_vote_path(post), 
      class: "glyphicon glyphicon-chevron-down #{(current_user.voted(post) && current_user.voted(post).down_vote?) ? 'voted' : '' }", method: :post do %> 
     </div> 
     </div> 
    <% end %> 

Голосов Контроллер:

class VotesController < ApplicationController 
    before_action :load_post_and_vote 

    def up_vote 
    update_vote!(1) 
    redirect_to :back 
    end 

    def down_vote 
    update_vote!(-1) 
    redirect_to :back 
    end 
    private 
    def load_post_and_vote 
     @post = Post.find(params[:post_id]) 
     @vote = @post.votes.where(user_id: current_user.id).first 
    end 

    def update_vote!(new_value) 
     if @vote 
     authorize @vote, :update? 
     @vote.update_attributes(value: new_value) 
     else 
     @vote = current_user.votes.build(value: new_value, post: @post) 
     authorize @vote, :create? 
     @vote.save 
     end 
    end 
    end 

Я определил метод вверх и вниз в пределах контроллера голосов. Однако они вызываются через маршруты POST. Должен ли я использовать его как: put or: down_vote ???

Rails.application.routes.draw do 
    get 'comments/create' 

    devise_for :users 
    resources :users, only: [:update] 

    resources :topics do 
    resources :posts, except: [:index] 
    end 

    resources :posts, only: [] do 
    resources :comments, only: [:create, :destroy] 
     resources :favorites, only: [:create, :destroy] 

    post '/up-vote' => 'votes#up_vote', as: :up_vote 
    post '/down-vote' => 'votes#down_vote', as: :down_vote 
    end 

    get 'about' => 'welcome#about' # Redirecting the about variable to a welcome/about 
    get 'newpost' => 'posts#new' 
    root to: 'welcome#index' 

end 
+1

Вы должны убедиться, что метод запроса соответствует вашему маршруту. Если вы определили маршрут как PUT, вам нужно убедиться, что вы сделаете запрос PUT. –

+0

Когда я рейка маршрутов, маршруты являются POST-запросом –

+0

вы можете добавить route.rb – coderhs

ответ

2

Прежде всего, вы не должны использовать GET для изменения состояния объекта, поскольку этот глагол должен оставить его неизменным. Обычно POST зарезервирован для создания объектов (хотя он может быть спорным).

PUT - правильный глагол для обновления объекта.

Изменить ссылку:

<%= link_to " ", 
      post_up_vote_path(post), 
      class: "glyphicon glyphicon-chevron-up #{(current_user.voted(post) && current_user.voted(post).up_vote?) ? 'voted' : '' }", 
      method: :put do %> 

Затем в файле routes.rb, убедитесь, что у вас есть что-то вроде:

resources :posts do 
    member do 
    put 'up-vote' 
    end 
end 

Для получения дополнительной информации, проверьте всегда большое руководство по адресу: http://guides.rubyonrails.org/routing.html

Если все еще не работает, убедитесь, что форма с методом PUT создана ActionView, проверив DOM с Chrome. См метод здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to:

Этот модификатор будет динамически создать форму HTML ... если пользователь имеет JavaScript отключен, запрос вернется к использованию GET

Убедитесь, что :

  • вы не имеете некоторый JS код сбой
  • JS не отключается в вашем браузере
  • страница полностью загружена, прежде чем пытаться нажать
+0

. .. и 'jquery-ujs' на месте. –