Не удается создать ассоциацию own_to в контроллере

У меня есть 2 модели пользователей и компаний. (Я использую Devise для пользователя)

  • Пользователь принадлежит Компании.
  • У компании много Пользователей.

Моя модель User включает столбец client_id.

На данный момент пользователь регистрируется и направляется на new_company_path, где я хотел бы создать отношения. (Я бы предпочел сохранить это в 2 этапа).

Я знаю, что мой код неверен здесь, в companies_controller.rb, но это то место, где я

  def create
    @user = current_user
    @company = @user.Company.new(params[:company])

    respond_to do |format|
      if @company.save
        format.html { redirect_to root_path, notice: 'Company was successfully created.' }
        format.json { render json: @company, status: :created, location: @company }
      else
        format.html { render action: "new" }
          format.json { render json: @company.errors, status: :unprocessable_entity }
      end
    end

person cupcakekid    schedule 14.01.2013    source источник


Ответы (2)


Ваша проблема лежит в пределах линии

@company = @user.Company.new(params[:company])

Связь от пользователя к компании не должна начинаться с заглавной буквы. Чтобы связать компанию с пользователем, вы должны вызвать ее так:

@user.company

Однако, если нет связанной компании, то этот метод вернет nil, и вы не сможете вызвать .new для nil, поэтому вместо этого вам нужно вызвать другой метод, который Rails создает для вас, с именем build_company, например:

@company = @user.build_company(params[:company])

Последняя проблема заключается в том, что, поскольку именно пользователь принадлежит компании, экземпляр User необходимо обновить с помощью вновь созданного company_id, а этого не произойдет, если вы сохраните только компанию. Но когда вы используете метод build_company, он сохранит экземпляр компании в ассоциации с пользователем, поэтому, если вы вызовете save для пользователя вместо компании, он создаст компанию и свяжет ее с пользователем, например:

def create
  @user = current_user
  @user.build_company(params[:company])

  respond_to do |format|
    if @user.save
      format.html { redirect_to root_path, notice: 'Company was successfully created.' }
      format.json { render json: @user.company, status: :created, location: @user.company }
    else
      format.html { render action: "new" }
      format.json { render json: @user.company.errors, status: :unprocessable_entity }
    end
  end
end
person DanneManne    schedule 14.01.2013
comment
Спасибо DanneManne за то, что вы не только предоставили ответ, но и разобрали его :) Именно @user.save меня сбил с толку, теперь это имеет смысл. Очень признателен! - person cupcakekid; 14.01.2013

Вашей модели User нужен столбец company_id. Затем вы можете создать форму для записи этого значения в любом месте (например, на странице new_company_path).

person okay56k    schedule 14.01.2013
comment
Оно делает. Он включен в мою миграцию devise_creates_user и подтверждается, когда я запускаю User.all в консоли... Такое ощущение, что я что-то упускаю. - person cupcakekid; 14.01.2013
comment
И вы определили отношения в моделях, т. е. компания has_many :users; пользователь belongs_to :company? Потому что, как только это будет сделано, и идентификаторы компаний будут записаны в этот столбец, это все, что вам нужно сделать. - person okay56k; 14.01.2013
comment
Ага, у меня есть такие. Я создаю пользователя, затем создаю компанию, но когда я ищу этого вновь созданного пользователя в консоли, их company_id = nil. Я обновлю сообщение с большим количеством кода. - person cupcakekid; 14.01.2013