(params [:id])在方法调用后更改

时间:2013-07-10 14:32:50

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试在我的控制器中调用一个方法来更改对象上的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)运行查询。

1 个答案:

答案 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