1

我试图在我的控制器中调用一个方法来更改对象上的布尔值。基本上用户点击“验证”,这被称为: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)运行查询。

4

1 回答 1

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

于 2013-07-10T16:26:18.763 回答