帮助方法检查记录是否由rails中的当前用户拥有

Dav*_*ani 2 authentication ruby-on-rails view-helpers ruby-on-rails-3

我正在建立一个rails 3应用程序,我正在使用设计来管理auth逻辑,但我想知道是否有一个帮助方法来检查当前用户是否拥有一个具有关联的对象(一个记录到db)"has_many ".

例:

User

has_many :reports 
Run Code Online (Sandbox Code Playgroud)

我有这种情况:

<%=  current_user.id == report.user.id ? "Personal Report" : report.user.username %>
Run Code Online (Sandbox Code Playgroud)

可以创建类似的东西:

<%= owned ? "yes" : "no" %>
Run Code Online (Sandbox Code Playgroud)

谢谢

Rah*_*arg 12

帮手:

def owned(report)
    current_user.id == report.user_id
end
Run Code Online (Sandbox Code Playgroud)

用法:

<%= owned(report) ? "yes" : "no" %>
Run Code Online (Sandbox Code Playgroud)

  • @davelab Helper方法被视为在视图中声明它们.所以他们可以访问传递的对象. (2认同)

MrY*_*iji 6

您可以在Report模型中定义此方法:

型号限制:

class Report < ActiveRecord::Base

  def owned_by?(user)
    self.user_id == (user.try(:id) || user)
  end
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

<%= report.owned_by?(current_user) ? 'yes' : 'no' %>
Run Code Online (Sandbox Code Playgroud)

owned_by?(user)方法接受User对象和Integer(user_id).

与User关联的每个模型的通用方法:

辅助方法可以解决这个问题:

module OwnerHelper
  def is_owner?(object)
    return nil if(current_user.nil? || !object.respond_to(:user_id))
    current_user.try(:id) == object.try(:user_id)
  end
end
Run Code Online (Sandbox Code Playgroud)

true如果current_user是owner,则返回此帮助程序,如果不是则返回false,nil如果current_usernilOR,则该对象没有user_id属性.