我有一个测试试图查看不存在的订阅。我和我的灯具用户一起运行这个测试。如果用户处于管理员角色,当应用程序到达尝试呈现响应时,它已将操作从: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
来自cancancan。
我与此测试相关的路线是:
resources :subscriptions do
member do
get 'confirm'
end
end
我真的不知道从哪里开始,所以任何建议都会受到赞赏。
答案 0 :(得分:1)
查看此异常的堆栈跟踪:
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>'
app/views/subscriptions/show.html.erb
,第13行。您是否使用link_to
ID调用nil
(或类似的辅助方法)?
答案 1 :(得分:0)
查看您的错误消息。它表示缺少id
参数。你有可能给它一个nil
值。因此,路由器无法正确路由请求。
此外,错误是针对edit
操作的请求,但您显示的代码正在调用show
操作。您是否可以清理显示的代码示例和错误消息并使它们保持一致?