存在しないサブスクリプションを表示しようとするテストがあります。このテストは、フィクスチャの多数のユーザーで実行します。管理者ロールのユーザーの場合、アプリが応答をレンダリングしようとする段階に達したときに、アクションが から:show
に変更され:edit
、パラメーターが削除されましたid
。しかし、 byebug を使用して実行を追跡しようとすると、いつ発生したかを特定できないようです。
私のテストは:
test "#{u.role} can not view subscriptions that don't exist" do
self.send('sign_in_' + u.role)
get :show, id:1234567890
assert_redirected_to root_path
assert_includes flash[:alert], "That subscription doesn't exist"
end
u
フィクスチャからロードされたユーザーはどこですか。
私が得るエラーは次のとおりです。
SubscriptionsControllerTest#test_admin_can_not_view_subscriptions_that_don't_exist:
ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"subscriptions", :id=>nil} missing required keys: [:id]
app/views/subscriptions/show.html.erb:13:in `_app_views_subscriptions_show_html_erb__1518678276755260966_70268849069860'
test/controllers/subscriptions_controller_test.rb:58:in `block (2 levels) in <class:SubscriptionsControllerTest>'
私のコントローラーは次のようになります。
class SubscriptionsController < ApplicationController
load_and_authorize_resource except: [:create,:new]
before_action :set_subscription
def show
end
def edit
end
...
private
def subscription_params
params.require(:subscription).permit(:email,:confirmed)
end
def set_subscription
#byebug if user_signed_in? && current_user.role == 'admin' && self.action_name == 'show'
begin
if (params.has_key? :id) && (controller_name == 'subscriptions')
@subscription = Subscription.find(params[:id])
elsif user_signed_in?
@subscription = current_user.subscription || Subscription.new(email: current_user.email)
else
@subscription = Subscription.new
end
rescue ActiveRecord::RecordNotFound
@subscription = Subscription.new
flash.alert = "That subscription doesn't exist"
end
end
end
load_and_authorize_resource
カンカンカンに由来。
このテストに関連する私のルートは次のとおりです。
resources :subscriptions do
member do
get 'confirm'
end
end
ここからどこに行けばいいのかわからないので、アドバイスをいただければ幸いです。