Используя Devise, как мне сделать так, чтобы пользователь мог редактировать / просматривать только принадлежащие ему элементы - PullRequest
0 голосов
/ 22 октября 2011

Я уже некоторое время борюсь с этим, поэтому я решил спросить экспертов.

Я пытаюсь сделать так, чтобы пользователи могли редактировать / просматривать только те элементы, которые они создали с помощью Devise.

У меня есть Пользователи, настроенные и работающие хорошо.Элементы создаются с пользователем, связанным с ними, и я могу проверить это через консоль rails.

def create
 @item = Item.new(params[:item])
 @item.user = current_user
end

Сейчас я пытаюсь сделать так, чтобы после входа в систему пользователи могли видеть только созданные им элементы, а другие - нет.

В моем контроллере Предметов пытались заменить:

def index
 @items = Items.all
end

на

def index
 @items = current_user.Items.find(params[:id])
end

, но мне кажется, что это не работает, и я получаю

undefined method `Items' for #<User:0x007fdf3ea847e0>

Кто-нибудь может посоветовать, что попробовать дальше?

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 22 октября 2011
  1. Может быть, я старая школа, но я бы не использовал current_user для поиска записей, только для проверки разрешений. Я бы использовал отношения первичного ключа напрямую (они не меняются):

    @items = Item.find(:all, :conditions => { :user_id => current_user[:id] }

или

@items = Item.find_all_by_user_id current_user[:id]

Что касается установки разрешений, devise фактически не позволяет вам делать это, НО есть отличное дополнение под названием Cancan, вы обязательно должны его изучить. С Cancan у вас будет классility.rb, который определит ваши разрешения. То, что вы ищете, становится:

class Ability
  can [:read, :show, :edit, :update, :delete, :destroy], Item do |item|
    item.user_id == user.id
  end

  # or
  can :manage, Item do |item|
    item.user_id == user.id
  end
end

чтение канканских документов прояснит код выше.

1 голос
/ 22 октября 2011

Если я понимаю ваш вопрос, я думаю, что вы можете проверить библиотеку авторизации - например, CanCan, чтобы сделать это.

https://github.com/ryanb/cancan

Это работает довольно гладко, чтобы обрабатывать подобные вещи типа разрешения.Многие люди используют эту библиотеку вместе с Devise.

1 голос
/ 22 октября 2011

То, что вы пытаетесь сделать, действительно близко ...

current_user - это "экземпляр" класса User.

То, что вы хотите сделать, это использовать ассоциациюиз пользовательского экземпляра, который является специальным методом, применяемым к каждому пользователю - "items".(Если класс Item также имеет belongs_to :user, он также будет иметь метод с именем user)

Вы хотите current_user.items.find(params[:id])

Кроме того, когда вы создаете его,Вы также можете использовать current_user.items.create(params[:item])

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