вспомогательный метод, чтобы проверить, принадлежит ли запись текущему пользователю в рельсах

я создаю приложение для рельсов 3, я использую devise для управления логикой аутентификации, но мне было интересно, есть ли вспомогательный метод, чтобы проверить, владеет ли текущий пользователь объектом (запись в БД), который имеет ассоциацию "has_many ".

пример:

User

has_many :reports 

у меня такая ситуация:

<%=  current_user.id == report.user.id ? "Personal Report" : report.user.username %>

можно создать что-то вроде:

<%= owned ? "yes" : "no" %>

Благодарность


person DavideCariani    schedule 28.01.2013    source источник


Ответы (2)


Помощник:

def owned(report)
    current_user.id == report.user_id
end

Применение:

<%= owned(report) ? "yes" : "no" %>
person Rahul garg    schedule 28.01.2013
comment
это не может работать, потому что помощник не может знать связанные методы модели отчета за пределами представления, и я не хочу передавать report.user.user_id как параметр. каждый раз, когда я использую собственный помощник - person DavideCariani; 28.01.2013
comment
Вспомогательные методы @davelab обрабатываются так, как если бы они были объявлены в представлении. Таким образом, они могут получить доступ к переданному объекту. - person Manoj Monga; 28.01.2013
comment
@davelab, если у вас есть доступ к отчету в представлении, вы можете использовать этот вспомогательный метод - person Jesse Wolgamott; 28.01.2013

Вы можете определить этот метод в своей модели Report:

Модель ограничена:

class Report < ActiveRecord::Base

  def owned_by?(user)
    self.user_id == (user.try(:id) || user)
  end

А затем используйте его следующим образом:

<%= report.owned_by?(current_user) ? 'yes' : 'no' %>

Этот метод owned_by?(user) принимает как объект пользователя, так и целое число (user_id).

Общий метод для каждой модели, связанной с пользователем:

Вспомогательный метод сделает свое дело:

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

Этот помощник вернет true, если current_user является владельцем, false, если нет, и nil, если current_user является nil, ИЛИ объект не имеет атрибута user_id.

person MrYoshiji    schedule 28.01.2013
comment
Небольшая опечатка: вы использовали owner_by в определении метода и вашем объяснении. Пытался исправить сам, но правки должны изменить не менее 6 символов. - person Chris Fletcher; 28.01.2013
comment
Спасибо @ChrisFletcher, я исправил это! - person MrYoshiji; 28.01.2013
comment
я хотел бы иметь общий метод для каждой модели, связанной с пользователями. - person DavideCariani; 28.01.2013
comment
@MrYoshiji Отличная работа с общим методом, очень приятно !! :) - person Raindal; 29.01.2013