2012-01-10 2 views
1

Я пытаюсь интегрировать forem с thumbs_up. Я унаследовал модель и контроллер forem Post.routing issue rails 3.1 thums_up and forem

Вот мой контроллер: -

class PostsController < Forem::PostsController 
    def vote_up 
    begin 
     current_user.vote_for(@post = Post.find(params[:id])) 
     render :nothing => true, :status => 200 
    rescue ActiveRecord::RecordInvalid 
     render :nothing => true, :status => 404 
    end 
    end 
end 

Вот как сообщение Контроллер ФОРЕМ выглядит следующим образом: -

module Forem 
    class PostsController < Forem::ApplicationController 
    before_filter :authenticate_forem_user 
    before_filter :find_topic 
    . 
    . 
    . 
    . 
private 

    def find_topic 
     @topic = Forem::Topic.find(params[:topic_id]) 
    end 
    end 
end 

Вот мои маршруты: -

mount Forem::Engine, :at => "/forums" 

resources :posts do 
    member do 
    post :vote_up 
    end 
end 

Здесь is my view: -

<%= link_to t('vote for this post!', :scope =>"forem.post"), main_app.vote_up_post_path(@post), :method => :post %> 

Это ошибка, которую я получаю: -

ActiveRecord :: RecordNotFound в PostsController # vote_up

Не удалось найти ФОРЭЙ :: Темы без ID

Что может быть проблема?

+0

Как выглядит 'current_user.vote_for'? –

+0

@muistooshort, что вы имеете в виду, как выглядит current_user.vote_for?vote_for предоставлен thumbs_up gem –

+0

Похоже, что 'current_user.vote_for' делает вызов' Forem :: Topic.find', не давая ему идентификатора, вот что сообщение об ошибке, кажется, говорит вам, и я ничего не вижу что может вызвать его, поэтому мне интересно, почему 'vote_for' делает то, чего он не должен делать. –

ответ

1

Ваша проблема является перед фильтром:

module Forem 
    class PostsController < Forem::ApplicationController 
    #... 
    before_filter :find_topic 
    #... 
    def find_topic 
     @topic = Forem::Topic.find(params[:topic_id]) 
    end 

, а затем:

class PostsController < Forem::PostsController 
    def vote_up 
    #... 

Так find_topic будет вызываться перед vote_up но маршрут для vote_up не будет иметь :topic_id; нет :topic_id означает, что find_topic будет делать это:

@topic = Forem::Topic.find(nil) 

и где ваша ошибка приходит.

Три варианта приходят на ум:

  1. Move vote_up в отдельный класс контроллера, который не наследует от Forem::ApplicationController.
  2. Добавить skip_filter :find_topic, :only => :vote_up в ДолжностиController.
  3. Настройте маршрут и ссылку, чтобы получить :topic_id в пути.

Если вы не нуждаетесь в @topic, тогда (1) или (2) будут работать, в противном случае вам придется пойти с (3).

+0

Я не знаю, как продолжить опцию 3, попробовал вариант 1 и 2, но это, похоже, не работает. Я думаю, @topic потребуется, потому что я думаю, что архитектура forem - это форум -> тема -> размещать любые идеи? –

+0

@Dev: Есть ли связь между темами и сообщениями? Если есть, то вы можете получить свой '@ topic' из своего' @ post', а не из 'params'. –

+0

это ассоциация has_many: posts,: dependent =>: destroy,: order => "created_at ASC" –

0

rake routes проверка в командной строке, и проверить идентификатор должен быть пост: vote_up ИЛИ получить: vote_up - ror_master

и использовать debugger в контроллере! и напишите params там, возможно, вы получите решение.

+0

Я думаю, вы должны использовать 'get: vote_up' в маршрутах. Проверьте и проверьте. –

+0

Вы имеете в виду вместо сообщения: vote_up Я должен использовать get: vote_up? –