0

以下のコントローラーの redirect_to に問題があると思います。コースには多くのレベルがあり、多くのステップがあります (ステップはレベルに属し、レベルはコースに属します)。ステップに redirect_to しようとしています。

ステップのルートは次のとおりです。

/courses/:course_id/levels/:level_id/steps/:id(.:format)

コントローラーのエラーは次のとおりです。

Failure/Error: click_button "check answer"
 NoMethodError:
   undefined method `step_url' for #<UserStepsController:0x007ff8ccc478c8>

エラーが発生したコントローラーは次のとおりです。

class UserStepsController < ApplicationController
    before_filter :authenticate_user!

    def create
        @step = Step.find(params[:user_step][:step_id])
        current_user.attempt_step!(@step)
        respond_to do |format|
          format.html { redirect_to @step }
          format.js
        end
    end

    def destroy
        @step = UserStep.find(params[:id]).step
        current_user.remove_user_step!(@step)
        respond_to do |format|
          format.html { redirect_to @step }
          format.js
        end 
    end
end

ここにrspecがあります

    describe "attempting a step" do
        let(:course) { FactoryGirl.create(:course)}
        let(:level) { FactoryGirl.create(:level, course: course) }
        let(:step) { FactoryGirl.create(:step, level: level) }
        before { sign_in user}

        describe "taking a course" do
            before { visit course_level_step_path(course.id, level.id, step.id)}

            it "should increment the user step count" do
                expect do
                    click_button "check answer"
                end.to change(user.user_steps, :count).by(1)
            end

            describe "toggling the button" do
                before { click_button "check answer"}
                it {  should have_selector('input', value: 'remove step')}
            end

        end
4

1 に答える 1

0

ネストされたリソースがある場合は、redirect_to @variable を使用できません。正しい方法はあなたが言うことです

redirect_to course_level_step_url(@step.level.course.id, @step.level.id, @step.id)

インスタンス変数からルートを取得するものは「考える」ため、小文字のクラス名と_urlのパスが必要です

于 2013-10-11T21:08:27.787 に答える