0

投票可能と呼ばれる投票モデルのポリモーフィックな関連付けがあります。これはコントローラーです:

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ここでテストでどのように使うべきか説明できますか?そして、私はすべてが生産でうまく機能していることを言及しなければなりません。

4

1 に答える 1

0

このようにテストを書いただけで合格しました。

it 'lets all users to create vote', focus: true do
  post :create, story_id: @story, rating_id: @rating, voteable: "stories"
  flash[:notice].should eq(I18n.t('controllers.votes.create.flash.success'))
end
于 2012-11-19T13:15:14.897 に答える