Ruby on rails 通过定义虚拟属性获取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的回答所指出的,从应用程序设计的角度来看,这一切都是错误的。我更改了它,因此除非条件为真,否则我的
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?
或您