#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
У меня есть проект, в котором пользователь может владеть проектом и участвовать в проекте как команда.
Мои модели такие:
class User
has_many :projects, :foreign_key => "owner_id"
has_many :project_memberships, :foreign_key => "member_id"
has_many :shared_projects, :class_name => "Project", :through => :project_memberships, :foreign_key => "member_id"
end
class Project
belongs_to :owner, :class_name => "User"
has_many :project_memberships
has_many :members, :class_name => "User", :through => "project_memberships", :foreign_key => "member_id"
end
Мой вопрос: как я могу создать / удалить и т.д. Новый проект, чтобы пользователь мог владеть им, поскольку я не использую вложенные ресурсы?
Вот контроллер моего проекта:
def new
@project = Project.new
end
def create
@owner = User.find(params[:user_id])
@project= @owner.projects.build(params[:project])
...
end
Заранее спасибо.
Ответ №1:
Если я правильно понимаю ваш вопрос, вам нужно сохранить текущий идентификатор пользователя, вошедшего в систему, в сеансе или использовать какой-нибудь механизм аутентификации (например, devise), который сделает это за вас.
Devise предоставляет вспомогательный метод current_user
, который возвращает экземпляр пользовательской модели. Итак, вы могли бы сделать вот так:
def create
@project= current_user.projects.build(params[:project])
...
end
Обновить
Если вы передаете user_id через форму, вы разрешаете любому пользователю создавать проект с идентификатором другого пользователя. Действия, которые создают что-либо, принадлежащее текущему пользователю, должны быть ограничены текущим пользователем на стороне сервера
Комментарии:
1. Я думаю, что я это уже делал, и у меня ничего не получилось. Моя форма начинается с этого:
<%= form_for ([@user,@project]) do |f| %>
. Это неправильно? Спасибо за ответ.2. На самом деле, у меня были некоторые проблемы с
build
методом, поэтому я закончил сModel.create
и передал current_user в качестве аргумента для быстрого исправления ошибок.3. Пожалуйста, дайте немного больше информации о части «не работает». Если это ошибка, о чем она говорит? Если нет, что произойдет?
4. Я могу создать новый проект, но без идентификатора пользователя.
5. Разобрался проблема была с моей базой данных, но с вашим методом все работает. И я использовал
build
вместоModel.create
. Спасибо!