我需要在Ruby on Rails应用程序中实现细粒度的访问控制.单个用户的权限保存在数据库表中,我认为最好让相应的资源(即模型的实例)决定是否允许某个用户从中读取或写入.每次在控制器中做出这个决定肯定不会很干.
问题是,为了做到这一点,模型需要访问当前用户,调用类似的东西.但是,模型通常无法访问会话数据. may_read?(current_user, attribute_name)
有一些建议可以在当前线程中保存对当前用户的引用,例如在 此博客文章中.这肯定会解决问题.
相邻的Google搜索结果建议我在User类中保存对当前用户的引用,我想这应该是那些应用程序不必同时容纳很多用户的人.;)
长话短说,我觉得我希望从模型中访问当前用户(即会话数据)来自我做错了.
你能告诉我我错了吗?
我有一个具有:credits属性的User模型.我想要一个简单的按钮,通过一个名为"add"的路由将5添加到用户的信用点,这样/ users/3/add会将5添加到用户id = 3的信用点.
def add
@user = User.find(params[:id])
@user.credits += 5
redirect_to root_path
end
Run Code Online (Sandbox Code Playgroud)
这是我的控制器的相关部分.问题是,我不想调用@ user.save,因为我有一个before_save回调,它根据当前的UTC时间重新加密用户的密码.我只想简单地为属性添加5并避免回调,我从未想过这么简单的事情会如此困难.
编辑:
我将回调更改为:before_create,这是我的新控制器代码(相关部分):
def add
@user = User.find(params[:id])
@user.add_credits(5)
@user.save
flash[:success] = "Credits added!"
redirect_to root_path
end
Run Code Online (Sandbox Code Playgroud)
这是我在模型中的代码:
def add_credits(num)
self.credits = num
end
Run Code Online (Sandbox Code Playgroud)
编辑2:
好吧,这是一个验证问题,使"编辑"中的更改无法正常工作,但我仍然喜欢在没有回调的情况下更新原始问题的答案!
我想在我的模板中为我的ruby on rails项目添加一个图像,其中我当前<img src="../../../public/images/rss.jpg" alt="rss feed" />在布局stores.html.erb文件中有代码但是这似乎没有加载,因为它看起来像它缺少一条我不知道是什么的路线它应该是.
有什么想法吗?
我试图找到多个数组之间的交集值.
例如
code1 = [1,2,3]
code2 = [2,3,4]
code3 = [0,2,6]
Run Code Online (Sandbox Code Playgroud)
结果将是2
我知道在PHP中你可以用array_intersect做到这一点
我希望能够轻松添加额外的数组,所以我真的不想使用多个循环
有任何想法吗 ?
谢谢,亚历克斯
在Ruby中,==和===之间有什么区别?该RDoc的说
Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写以在case语句中提供有意义的语义.
是#==一样的==吗?你能举例说明在case语句中何时/如何使用它?
我在Ruby on Rails中遇到了一个问题.我希望将一串格式Tue, 10 Aug 2010 01:20:19 -0400 (EDT)转换为日期对象.
无论如何我能做到这一点.
这是我在下面看到并尝试过的,没有运气:
Date.strptime(updated,"%a, %d %m %Y %H:%M:%S %Z")这个你能帮我吗.
我试图理解Ruby中的JSON序列化格局.我是Ruby的新手.
如果您不使用Rails,是否有任何好的JSON序列化选项?
这似乎就是这个答案所针对的(对于Rails) 如何将Ruby对象转换为JSON
json gem看起来好像你必须编写自己的to_json方法.我无法让to_json处理数组和散列(文档说它适用于这些)是否有一个原因json gem不只是反映对象并使用默认的序列化策略?这不是如何to_yaml工作(猜测在这里)
我曾经使用mysql宝石,但现在我经常听说mysql2宝石.此外,它默认包含在Gemfile中Rails 3.0.x.
使用mysql2宝石有什么区别和优点?