Ruby on rails 通过定义虚拟属性获取Rails表单验证中的当前用户

Ruby on rails 通过定义虚拟属性获取Rails表单验证中的当前用户,ruby-on-rails,ruby,validation,virtual-attribute,Ruby On Rails,Ruby,Validation,Virtual Attribute,Rails表单验证设计为最容易进入模型。但我需要确保当前用户具有提交帖子所需的权限,并且current_user变量只能在控制器和视图中访问 我在一本书中找到了这个答案: 您可以为书籍定义一个:user\u gold虚拟属性,在您有权访问当前用户的控制器中进行设置,然后将其合并到书籍验证中` 如何使用我的post和用户控制器进行设置,以便在模型中可以访问当前用户变量 解决方案: 正如@Deefour的回答所指出的,从应用程序设计的角度来看,这一切都是错误的。我更改了它,因此除非条件为真,否则我的

Rails表单验证设计为最容易进入模型。但我需要确保当前用户具有提交帖子所需的权限,并且
current_user
变量只能在控制器和视图中访问

我在一本书中找到了这个答案:

您可以为
书籍
定义一个
:user\u gold
虚拟属性,在您有权访问
当前用户
的控制器中进行设置,然后将其合并到
书籍
验证中`

如何使用我的post和用户控制器进行设置,以便在模型中可以访问
当前用户
变量

解决方案: 正如@Deefour的回答所指出的,从应用程序设计的角度来看,这一切都是错误的。我更改了它,因此除非条件为真,否则我的视图不会呈现表单。

类似的问题是,您可以这样做

class YourModel < ActiveRecord::Base
  attr_accessor :current_user

  # ...
end
然后,您可以在您的模型的验证方法中使用
self.current\u user


<强>注<强>我认为这不是你应该做的,因为我不认为这个“验证”和<强>“授权”< /强>一样多。未经授权的用户甚至不应该能够获得可以保存对

YourModel
实例的更新的操作部分


至于按照要求使用Pundit进行授权,您将在
app/policies/your_model.rb

class YourModelPolicy < Struct.new(:user, :your_model)
  def update?
    user.some_privilege == true # change this to suit your needs, checking the "required privileges" you mention
  end
end
然后,在控制器操作中,您可以简单地执行以下操作

def update
  @your_model = YourModel.find(params[:id])
  authorize @your_model

  # ...
authorize
方法将调用
YourModelPolicy
update?
方法(默认情况下,它调用与您的操作匹配的方法+
),如果返回错误值,将导致403错误。

类似的问题是说您可以这样做

class YourModel < ActiveRecord::Base
  attr_accessor :current_user

  # ...
end
然后,您可以在您的模型的验证方法中使用
self.current\u user


<强>注<强>我认为这不是你应该做的,因为我不认为这个“验证”和<强>“授权”< /强>一样多。未经授权的用户甚至不应该能够获得可以保存对

YourModel
实例的更新的操作部分


至于按照要求使用Pundit进行授权,您将在
app/policies/your_model.rb

class YourModelPolicy < Struct.new(:user, :your_model)
  def update?
    user.some_privilege == true # change this to suit your needs, checking the "required privileges" you mention
  end
end
然后,在控制器操作中,您可以简单地执行以下操作

def update
  @your_model = YourModel.find(params[:id])
  authorize @your_model

  # ...

authorize
方法将调用
YourModelPolicy
update?
方法(默认情况下,它调用与您的操作匹配的方法+
),如果返回错误值,将导致403错误。

不应在模型中执行授权。模特已经有很多责任了,你不觉得吗

这是一个控制器的东西,实际上,你可以在其他地方使用一些类似gem的逻辑,在你的控制器中,你可以做如下事情:

authorize! :create, Post

授权不应该在模型中进行。模特已经有很多责任了,你不觉得吗

这是一个控制器的东西,实际上,你可以在其他地方使用一些类似gem的逻辑,在你的控制器中,你可以做如下事情:

authorize! :create, Post
您可以在模型中定义“虚拟属性”,如下所示:

class Book < ActiveRecord::Base
  attr_accessor :current_user
end
class BooksController < ApplicationController
  def create
    book = Book.new
    book.current_user = current_user
    book.save!
  end
end
我不记得ActiveRecord是否是这种情况,但您可能可以通过批量分配方法设置虚拟属性,如控制器中的
创建
更新
新建

def create
  Book.create!(current_user: current_user)
end
为此,您可能需要向模型中添加以下行,以启用该虚拟属性的批量指定:

attr_accessible :current_user
您可以在模型中定义“虚拟属性”,如下所示:

class Book < ActiveRecord::Base
  attr_accessor :current_user
end
class BooksController < ApplicationController
  def create
    book = Book.new
    book.current_user = current_user
    book.save!
  end
end
我不记得ActiveRecord是否是这种情况,但您可能可以通过批量分配方法设置虚拟属性,如控制器中的
创建
更新
新建

def create
  Book.create!(current_user: current_user)
end
为此,您可能需要向模型中添加以下行,以启用该虚拟属性的批量指定:

attr_accessible :current_user

我同意伊斯梅尔的观点——这通常是在控制器中完成的。它不是模型的属性,而是权限问题,与控制器业务逻辑相关

如果你不需要像CanCan这样的宝石的所有力量,你可以扮演自己的角色

class BooksController < ApplicationController

  before_filter :gold_required, :only => :create

  def create
    book = Book.new
    book.save!
  end


  # Can be application controller
  private
  def gold_required
    return current_user && current_user.is_gold?
  end

end
class BooksController:create
def创建
书
书,救命!
终止
#可以是应用程序控制器
私有的
需要def gold_
返回当前用户和当前用户。是否为黄金?
终止
终止

您可能还希望将过滤器置于“新”方法上。

我同意Ismael的观点-这通常在控制器中完成。它不是模型的属性,而是权限问题,与控制器业务逻辑相关

如果你不需要像CanCan这样的宝石的所有力量,你可以扮演自己的角色

class BooksController < ApplicationController

  before_filter :gold_required, :only => :create

  def create
    book = Book.new
    book.save!
  end


  # Can be application controller
  private
  def gold_required
    return current_user && current_user.is_gold?
  end

end
class BooksController:create
def创建
书
书,救命!
终止
#可以是应用程序控制器
私有的
需要def gold_
返回当前用户和当前用户。是否为黄金?
终止
终止

您可能还需要将过滤器置于“新”方法上。

cancan有多大?很多代码?还是轻巧?我能从头开始吗?有些人觉得cancan有点笨拙。一个很好的、轻量级的替代方案是,它添加了一些视图帮助程序,它有很多东西,但ofc您可以自己编写代码。您只需要向用户添加角色,还有一个名为rolify的gem。但是,如果你的角色是基于应用程序的,而不是基于模型的,那么没有它你就可以了。然后你可以在你的控制器中设置逻辑,比如
重定向到'index',消息:“你没有权限,伙计!”除非是当前的\u user.admin?
或您