我需要在Ruby on Rails应用程序中实现细粒度的访问控制.单个用户的权限保存在数据库表中,我认为最好让相应的资源(即模型的实例)决定是否允许某个用户从中读取或写入.每次在控制器中做出这个决定肯定不会很干.
问题是,为了做到这一点,模型需要访问当前用户,调用类似的东西.但是,模型通常无法访问会话数据. may_read?(current_user, attribute_name)
有一些建议可以在当前线程中保存对当前用户的引用,例如在 此博客文章中.这肯定会解决问题.
相邻的Google搜索结果建议我在User类中保存对当前用户的引用,我想这应该是那些应用程序不必同时容纳很多用户的人.;)
长话短说,我觉得我希望从模型中访问当前用户(即会话数据)来自我做错了.
你能告诉我我错了吗?
我需要在我的User模型中调用current_user(在ApplicationControler中定义,就像帮助器一样).
我测试ApplicationController.helpers.curret_user但不起作用:
irb(main):217:0> ApplicationController.helpers.current_user
NoMethodError: undefined method `current_user' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
但这种方法在控制器和视图中工作正常......
那么如何让我当前的用户进入模型?
当一次从我的单独前端应用程序向 Rails API 发送多个请求时,我使用 Puma 开发的 Rails 5 服务器一直冻结并挂起。没有错误,它只是挂在 POST 请求上。当我尝试使用 CTRL + C 终止服务器时,没有任何反应。我必须手动终止该端口。
我尝试在development.rb中设置config.eager_load=true。我尝试在 application.rb 中添加 config.allow_concurrency 。我不停地用谷歌搜索毫无结果。我从前端同时发送大约 5 个请求,所以我相信是这么多请求造成的,但我不确定。
有其他人经历过这种情况或者知道这里需要做什么吗?我通常可以让所有请求成功返回前端大约 3-4 次,然后服务器就会冻结。
尤其是在服务器运行时更改项目中任何文件中的任何一行代码后,尤其会发生这种情况。
所以我在http://railscasts.com/episodes/250-authentication-from-scratch上使用了"从头开始验证"railscast中的逻辑,它似乎工作,我可以坚持"你登录为. .."页面顶部的消息.
但是,如果我想做一些像提交帖子的日志这样的事情,我会碰到一点墙.
我不想通过新帖子中的隐藏字段提交它,因为我猜这有安全问题.
我不想在http://ruby.railstutorial.org/ruby-on-rails-tutorial-book的rails教程中使用"属于"逻辑,因为虽然它在技术上可以在这里工作,但我可能在将来需要记录谁创建了一个"属于"关系不存在的条目.
我试图做的是在我的post模型中创建一个"before save"函数调用,它指定一个"created_by"值,但我猜模型不能访问根据认证railscast创建的current_user.
所以现在我不知道怎么做这样的事情.
编辑:Ruby的新手,ERD的新手,所有这一切,但我所说的属于关系不存在的是,如果有一个评级系统的帖子,每个评级都属于一个帖子.但我也想记录提交每个评级的人.
我有以下型号:
class Rating < ActiveRecord::Base
belongs_to :item
belongs_to :user
end
class Item < ActiveRecord::Base
has_many :ratings
end
Run Code Online (Sandbox Code Playgroud)
我想获取所有项目,以及特定用户的评级,以显示每个项目旁边的当前用户评级(如果存在!).
我试过了...
Item.includes(:ratings).where('ratings.user_id = ?', user_id)
Run Code Online (Sandbox Code Playgroud)
...但是没有给我没有评级的项目.
我的第一个想法是与参数的has_many关联,然后使用includes方法传递该参数.但这似乎并不存在.
如何在不执行N + 1查询或将所有实体加载到内存中的情况下,在参数上过滤所有帖子和预先加载的关联?
我有一个模型Expense.rb,用户有很多.可以通过ajax表单添加新费用,因此我有适当的文件设置(create.js.erb,destroy.js.erb ..等)
目前,当通过远程表单提交新费用时,还会在create.js.erb中更新金额总和,这在我的Expense模型中如下所示:
def total_value
Expense.sum(:amount)
end
Run Code Online (Sandbox Code Playgroud)
create.js.erb:
$('#total').html('$<%= number_with_delimiter(@expense.total_value) %>');
问题是这总结了数据库的所有费用,而我只需找到current_user(我知道无法从模型访问).
在我的控制器内部,在索引操作上,我这样做:
@expenses = current_user.expenses
@total_value = @expenses.sum(:amount)
Run Code Online (Sandbox Code Playgroud)
这意味着我只需执行以下操作即可在索引视图中为current_user获取它:
<%= number_with_delimiter(@total_value) %>
但至于创造行动:
def create
@expense = Expense.new(secure_params)
@expense.user = User.find(current_user.id)
@expense.save
respond_to do |format|
format.html { redirect_to index_expense_path }
format.js
end
end
Run Code Online (Sandbox Code Playgroud)
我不确定如何将current_user传递给模型中的total_value,以便只计算create js.erb中使用的total_value中的current_user id.
ruby ×2
activerecord ×1
controller ×1
freeze ×1
helper ×1
javascript ×1
model ×1
puma ×1
server ×1
session ×1