2014-09-19 5 views
0

У меня есть comments_controller, который использует inherited_resources и имеет дело с этими моделями: Comment (belongs_to Shop and belongs_to User) и Shop (belongs_to User). Rails 4.1.1 и Inherited_resources v - 1.5.0.Ruby on Rails Inherited_resources multiple принадлежит_to

Маршруты:

resources :shop do 
    resources :comments, only: [:create, :destroy] 
end 

Однако приведенный ниже код не работает:

class CommentsController < InheritedResources::Base 
    before_filter :authenticate_user! 
    nested_belongs_to :user, :shop 
    actions :create, :destroy 

    def create 
    @comment = build_resource 
    @comment.shop = Shop.find(params[:hotel_id]) 
    @comment.user = current_user 

    create! 
    end 

    def destroy 
    @hotel = Shop.find(params[:hotel_id]) 
    @comment = Comment.find(params[:id]) 
    @comment.user = current_user 

    destroy! 
    end 

private 

    def permitted_params 
    params.permit(:comment => [:content]) 
    end 

Rspec, что создание тест/удаление комментариев скажите мне Couldn't find User without an ID.

Спасибо за любую помощь.

UPD Один из непройденных тестов:

let(:user) { FactoryGirl.create(:user) } 
    let(:shop) { FactoryGirl.create(:shop, user: user) } 

    describe "comment creation" do 
    before { visit shop_path(shop) } 

    describe "with invalid information" do 
     it "should not create a comment" do  
     expect { click_button "Post a comment" }.not_to change(Comment, :count) 
     end 
    end 
+0

Было бы полезно упомянуть, какую версию Rails вы находитесь. Этот драгоценный камень [унаследованные ресурсы] (https://github.com/josevalim/inherited_resources) довольно старый, и его автор советует не использовать его для Rails 3 и выше. – San

+0

@San Я обновил. Rails is 4.1.1 –

ответ

1

Из ваших маршрутов, это выглядит, как вы хотите иметь дело с Comments, принадлежащей Shop. В этом случае вам не нужно nested_belongs_to, вместо этого измените его на belongs_to :shop в своем контроллере, и это позаботится об этом. И добавьте еще одну строку belongs_to :user отдельно.

Таким образом, ваш контроллер будет выглядеть следующим образом:

class CommentsController < InheritedResources::Base 
    before_filter :authenticate_user! 
    belongs_to :shop 
    belongs_to :user 
    actions :create, :destroy 

    . 
    . 
    . 
end 
+0

Спасибо, я попробовал и ошибка изменилась! Теперь это 'undefined method' 'users 'для # ' .. –

+0

Где ошибка. Пожалуйста, отправьте тест, который вы используете, и полную версию. Благодарю. – San

+0

Я добавил тест. –