投票可能と呼ばれる投票モデルのポリモーフィックな関連付けがあります。これはコントローラーです:
class VotesController < ApplicationController
def create
begin
@voteable = get_voteable
@rating = Rating.find(params[:rating_id])
@user = current_user
@vote = Vote.new()
@vote.voteable = @voteable
@vote.rating = @rating
@vote.user = @user
rescue ActiveRecord::RecordNotFound
redirect_to stories_path, flash:{error: t('controllers.votes.create.flash.error')}
return
end
respond_to do |format|
if @vote.save
format.html { redirect_to story_path(@voteable), notice: t('controllers.votes.create.flash.success') }
end
end
end
private
def get_voteable
@voteable = params[:voteable].classify.constantize.find(voteable_id)
end
def voteable_id
params[(params[:voteable].singularize + "_id").to_sym]
end
end
ルーティングは次のようになります。
resources :stories do
resources :votes, :defaults => { :voteable => 'stories' }
end
コントローラのテストは次のとおりです。
before do
@story = FactoryGirl.create(:story)
@rating = FactoryGirl.create(:rating)
end
it 'creates vote' do
post :create, story_id: @story.id, rating_id: @rating
flash[:notice].should eq(I18n.t('controllers.votes.create.flash.success'))
end
テストは失敗します:
Failure/Error: post :create, story_id: @story.id, rating_id: @rating
ActionController::RoutingError:
No route matches {:story_id=>"1", :rating_id=>"1", :controller=
>"votes", :action=>"create"}
誰かが私にpost
ここでテストでどのように使うべきか説明できますか?そして、私はすべてが生産でうまく機能していることを言及しなければなりません。