我正在尝试在我的控制器中调用一个方法来更改对象上的bool。基本上,用户点击“验证”,这称为:verify_business_path(b)
我在URL users / id / dashboard。根据日志,它传递正确的ID并调用URL业务/ id / verify。这两个网址中的ID不同。然后调用验证方法:
def verify
@business = Business.find(params[:id])
if current_user.admin?
@business.update_attribute(:verified, true)
if @business.save
redirect_to dashboard_user_path(current_user.id)
else
redirect_to destroy_user_session
end
end
# save, render, etc
end
这得到的ID是错误的。它可以获取用户ID,而不是您在日志中看到的业务ID:
Started GET "/businesses/30/verify" for 127.0.0.1 at 2013-07-10 15:22:20 +0100
Processing by BusinessesController#verify as HTML
Parameters: {"id"=>"30"}
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 13 LIMIT 1
Redirected to http://localhost:3000/users/13/dashboard
Filter chain halted as :check_if_admin rendered or redirected
Completed 302 Found in 4ms (ActiveRecord: 0.6ms)
如何让验证方法使用业务ID而非用户ID?
由于
编辑:
您可以在日志中看到它在第3行传递了正确的参数(业务ID),但是在第4行上使用错误的参数(当前用户ID)运行查询。
答案 0 :(得分:0)
根据您的日志,由于verify
操作中的重定向而导致check_if_admin
操作永远不会被执行,这很可能是在before_filter
中调用的。
您可以通过移除verify
check_if_admin
来确保执行before_filter
。如果您想保留check_if_admin
的功能,请将其添加到条件中:
# app/controllers/businesses_controller.rb
def verify
@business = Business.find(params[:id])
if current_user.admin?
@business.update_attribute(:verified, true)
if @business.save
redirect_to dashboard_user_path(current_user.id)
else
redirect_to destroy_user_session
end
else # If user is not an admin
# Logic from `check_if_admin`
end
# save, render, etc
end
关于您的编辑,日志实际上是正确的。 Parameters: {"id"=>"30"}
表示业务ID作为参数传递,User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 13 LIMIT 1
表示查找current_user
。