- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Rails 的初学者,并且一直在寻找这个问题的许多建议答案。我似乎无法翻译答案,我已经看到了我的情况。我希望有人会很好地阐明它。我关心的两个模型是用户和项目。每个用户都可以创建一个项目,但每个用户也可以管理一个项目。为此,我在 User 和 Project 之间创建了一个 has_many :through 关系,使用管理模型连接这两个模型。
用户.rb
has_many :managings, foreign_key: "manager_id", dependent: :destroy
has_many :managed_projects, through: :managings
managing.rb
belongs_to :manager, class_name: "User"
belongs_to :managed_project, class_name: "Project"
项目.rb
has_one :reverse_managing, foreign_key: "managed_project_id",
class_name: "Managing",
dependent: :destroy
has_one :manager, through: :reverse_managing, source: :manager
所以,我有一个叫做“初学者”的角色。初学者只能阅读项目,除了那些选择成为项目经理的人。还应允许经理编辑和更新他们正在管理的项目。
下面是我在ability.rb中的尝试
user ||= User.new # guest user (not logged in)
if user.role? :Admin
can :manage, :all
elsif user.role? :Author
can :read, :all
can [:create], [Project]
can [:edit, :update], Project, :user_id => user.id
elsif user.role? :Beginner
can :read, :all
can [:edit, :update], Project, :manager_id => user.id
end
最后一行似乎不起作用,因为当我查看管理该项目的初学者的项目 View 时,我没有看到编辑链接。
这是我在 View 中使用的代码:
<% if can? :update, project %>
<%= link_to 'Edit', edit_project_path(project) %>
<% end %>
这就是 projects_controller 中出现的内容
def edit
@project = Project.find(params[:id])
authorize! :edit, @project
end
如果有人可以帮助我,我会睡一个快乐的人
更新
这里的作用是? User.rb 中的方法
def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end
更新
我为用户分配了错误的 role_id。更正此问题后,当我尝试打开包含编辑链接的项目 View 时收到一条错误消息。
undefined method `manager_id' for #<Project:0xb387f0b0>
最佳答案
问题出在这里:
can [:edit, :update], Project, :manager_id => user.id
cancan 能力条件只能使用数据库列(根据 cancan wiki)。这里 cancan 期望 manager_id 是 Project 模型中的一个列,实际上并非如此。你的模型看起来有点像这样:
用户 [id, ...]
项目 [id, ...]
管理 [manager_id, managed_project_id, ...]
manager_id 是管理中的字段,而不是项目中的字段。
解决方法是使用另一个 wiki page 中描述的 block 条件。 .我还没有测试过,但我认为以下方法会起作用 -
can [:edit, :update], Project do |p|
p.manager == user
end
关于ruby-on-rails - 用 has_many :through association 定义能力(CanCan),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175611/
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!