如何验证此对象的所有者是否正在修改它? (并写一个测试)

时间:2012-05-29 06:56:32

标签: ruby-on-rails validation rspec devise bdd

我试图开始测试以确认用户只能在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中为此编写测试...

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

谢谢!

1 个答案:

答案 0 :(得分: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&amp;水豚。逻辑很简单:您使用用户登录并期望在尝试编辑其他用户的信息时显示错误消息。否则,应显示相关的表单字段。

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