Rails 3 — Проблемы с ассоциацией моделей

#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 . Спасибо!