0

我试图开始测试以确认用户只能在 current_user.id 和 model.user_id 匹配时修改对象。

我觉得这是模型的验证。所以我可能会写这样的东西:

class UserLocked < ActiveModel::Validator  
  def validate(record)  
    unless record.user_id == current_user.id  
      record.errors[:name] << "Sorry you cannot modify something that is not your's"  
    end  
  end  
end 

哪个可能没问题... (我可以把它放在一个集中的地方吗?我需要做一些特别的事情来引用它吗?)

为此编写测试也不错。但是,我还需要防止控制器显示表单以编辑表单。我应该创建一个单独的视图还是让它成为编辑页面的一部分?我如何在 rspec 中为此编写测试...

我可能想多了,但我想弄清楚其他人在做什么。一个例子会很棒!我以前在其他语言/框架中做过这个,但我正在尝试“以正确的方式做事”。

谢谢!

4

1 回答 1

1

授权属于控制器而不属于模型。所以你可以像这样实现一个 before_filter :

class UsersController < ApplicationController
  before_filter :correct_user,   only: [:edit, :update]
  ...
  private

  def correct_user
    @user = User.find(params[:id])
    redirect_to root_path unless current_user? @user
  end
end

当然,您需要某种方法来检测当前用户是谁。

您可以使用 RSpec 和 Capybara 使用请求规范对此进行测试。逻辑很简单:您使用一个用户登录并期望在尝试编辑另一个用户的信息时会显示一条错误消息。否则应显示相关的表单字段。

有关示例,请参见http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#code:edit_update_wrong_user_tests

于 2012-05-29T07:38:31.340 回答