Как создать запись в модели через другую модель? - PullRequest
0 голосов
/ 17 февраля 2012

Я довольно новичок в Rails, и у меня есть вопрос новичка.

У меня есть три модели:

Пользователи - <Клиенты - <Проекты </p>

Чтобы создатьновый проект, который я хочу сделать в своем контроллере проекта:

def create
  @project = current_user.projects.build(params[:project])
end

Однако, я всегда получаю сообщение о том, что client_id отсутствует, т.е. я не могу установить его в таблице Projects.

Кто-нибудь может сказать мне, что мне здесь не хватает?

В моей модели User у меня есть ...

has_many :projects, :through => :clients

... которую я думалдолжен заставить

@user.projects.build()

работать.Но это не так.

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Из вашей ассоциации Project принадлежит Client, который принадлежит User. Возможно, вы захотите заняться редизайном.

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

@client = Client.find params[:client]
@project = @user.project.build params[:project], :client_id => @client.id

OR

@project = @user.clients.find(params[:client]).projects.build(params[:project])

В любом случае, у пользователя нет проектов. У них есть клиенты, у которых, в свою очередь, есть проекты. Возможно, вы захотите сделать модель Project моделью соединения. В этом случае ...

# user.rb
    has_many :clients, :through => :projects

# client.rb
    has_many :users, :through => :projects

# project.rb
    belongs_to :clients
    belongs_to :users
1 голос
/ 17 февраля 2012

Проблема, когда вы делаете этот вызов, заключается в том, , на каком клиенте это строится?Просто опираясь на current_user.projects не предоставляет эту информацию.Однако, чтобы решить эту проблему, нам нужно взглянуть на вашу форму и / или маршрутизацию, чтобы предоставить информацию о том, какой клиент использовать.

Например, вы могли бы фактически запустить форму с клиентом и использовать вложенныйресурсы в вашей форме, чтобы затем предоставить новый проект.

1 голос
/ 17 февраля 2012

Я думаю, что для таблицы / модели вашего проекта нужен client_id, который вы указываете при использовании

current_user.projects.build(params[:project])

Я думаю, вам следует использовать что-то вроде

active_project = current_user.active_project
active_project.clients.build(params[:project])

Это простопример.

...