Маршрутизация Rails devise_for/resources CRUD перекрывается

У меня есть разработка, работающая для моего класса User, и я пытаюсь добавить некоторые методы CRUD в контроллер пользователей. Я читал о маршрутизации для этого, и пока devise_for стоит перед resources, он будет иметь приоритет, иначе вы будете получать доступ только к несуществующим записям через /users/sign_in или что-то еще. Так или иначе.

У меня работают мои методы CRUD и даже некоторые ресурсы. Скажем, у пользователей много имущества. Я могу просмотреть имущество через /users/1/possessions/1, но когда я пытаюсь его удалить, у меня нет доступа к методу Devise current_user. Я мог бы удалить, выполнив поиск пользователя с помощью params[:user_id], а затем найдя его имущество с помощью params[:id], но это не совсем безопасно, если я хочу, чтобы вошедший в систему пользователь мог удалить свое собственное имущество .

Как я могу использовать методы Devise из методов CRUD моей модели пользователя?


person Zac    schedule 04.06.2011    source источник


Ответы (2)



Лучшей практикой может быть не вкладывать маршрут владения под пользователем, вместо этого иметь его самостоятельно как /possessions/1 и контроллер в вашем владении для охвата всех ваших находок текущим_пользователем, т.е.:

def index
  @possessions = current_user.possessions
end

def edit
  @possession = current_user.possessions.find(params[:id])
  ...
end

Таким образом, вы можете быть уверены, что пользователь сможет видеть только свои собственные предметы, и он получит 404, если попытается получить доступ к чужому имуществу.

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

class ProjectsController < InheritedResources::Base
  protected
    def collection
      @projects ||= end_of_association_chain.paginate(:page => params[:page])
    end
end
person Andrew Nesbitt    schedule 04.06.2011
comment
Это имеет смысл, за исключением того, что я использую Mongoid и хочу, чтобы Possessions был общедоступным, поэтому, поскольку Possession это embedded_in User, я не могу получить к нему доступ, не просматривая корневой документ (User). Кроме того, это действительно не повлияло на проблему, с которой я столкнулся, и теперь я думаю, что должна быть другая причина в моем possessions_controller в моем методе уничтожения, current_user возвращает ноль. Он работает в методе показа, но не в методе уничтожения. Есть идеи по этому поводу? - person Zac; 05.06.2011