这是一个示例实现:
export class Person extends Component {
componentDidMount() {
const { onLoadProfile, onLoadPolicy, person } = this.props
onLoadProfile(person.profile.uri)
onLoadPolicy(person.policy.uri)
}
componentDidUpdate(prevProps) {
const { onLoadProfile, onLoadPolicy, person } = this.props
const prevPerson = prevProps.person.uri
const curPerson = person.uri
// If person has changed, update Person component
if (prevPerson !== curPerson) {
onLoadProfile(person.profile.uri)
onLoadPolicy(person.policy.uri)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在componentDidMount(),我设法测试它像这样:
describe('<Person />', () => {
let props
let mountedPerson
const mockLoadProfile = jest.fn()
const mockLoadPolicy = jest.fn()
const person = () …Run Code Online (Sandbox Code Playgroud) 问题: 我需要根据组织集合的选择过滤单位集合.
选择组织后,单位下拉菜单应刷新以仅显示属于知情组织的单位.
我检查过这些问题:
这些文件:
到目前为止这是我的代码:
楷模
class Organization < ActiveRecord::Base
has_many :units
has_many :projects, through: :units
end
class Unit < ActiveRecord::Base
belongs_to :organization
has_many :projects
end
class Project < ActiveRecord::Base
belongs_to :organizaton
has_one :organization, through: :unit
end
Run Code Online (Sandbox Code Playgroud)
查看 app/views/projects/_form.html.erb
<%= form_for(@project) do |f| %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field …Run Code Online (Sandbox Code Playgroud) 我一直在摆弄CanCanCan gem以限制常规用户的操作,但到目前为止我只设法将授权限制为整个模型,而我真正需要的是限制对其某些属性的访问.
例如,在我的用户模型上,除了用户/密码/电子邮件之外,我有一个用于管理员的布尔值,我用它来验证登录用户的状态,在这种情况下,如果是user.admin ?,它可以访问/管理一切,否则,它应该能够读取所有内容,并且只有在user.id匹配时才能更新自己的记录.
我已经多次阅读文档,最接近的是将其添加到app/models/ability.rb中
can :update, :users, [:name, :password, :email]
Run Code Online (Sandbox Code Playgroud)
什么也没做.
所以,
问题:用户可以:更新整个模型,或者只是:读取它,我无法将其设置为:update或:读取特定属性.
我需要的是:用户能够:仅编辑特定属性.
问题:限制属性的正确语法是什么?我必须在其他一些文件上设置其他任何配置吗?
我的Ability.rb文件:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.admin?
can :manage, :all
can :import, [User, Enclosure, Blade, Component]
else
can :access, :rails_admin
can :dashboard
can :read, :all
can :history, :all
# Allows user to only edit an enclosure, if it's allocated to itself, or not allocated at all
can :update, Enclosure do |enclosure|
can :update, Enclosure if (enclosure.allocated_to …Run Code Online (Sandbox Code Playgroud) 软删除记录后,我无法在show控制器上的操作上调用它,因为它会查找与记录匹配的记录ID WHERE deleted_at IS NULLL,考虑到宝石的用途,这是正确的,但我仍然希望能够在应用程序内以某种“只读”状态访问它,以便允许用户查看存档并可能恢复它。
如何解决删除范围以便我可以再次访问该对象?
更新1
根据@slowjack2k的建议,我可以使用以下查询访问软删除的记录:
@area = Area.only_deleted.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
后来由于CanCanCan 的原因 load_and_authorize_resource出现了一个新问题:它尝试调用
@area = Area.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
忽略only_deleted过滤器,导致错误,因为仅在deleted_at不为空(未删除)的情况下找到选定的id,并禁用授权“修复”它,所以它一定是CanCanCan和Paranoia之间的问题。
这是一个具有完全相同问题的线程:https ://github.com/rubysherpas/paranoia/issues/356
这是 StackOverflow 上的新问题线程:Paranoia 和 CanCanCan 之间的 Rails 5 兼容性受到损害?
如果找到解决方案,我会再次更新,谢谢。
更新2
问题已解决,解决方案可以在我上面提到的新问题线程中找到。