зарегистрируйтесь и создайте новый объект одновременно

#ruby-on-rails #ruby #validation #devise

#ruby-на-рельсах #рубин #валидация #разработать #ruby-on-rails #ruby #проверка

Вопрос:

я новичок в Ruby on Rails. Я пытался зарегистрировать нового пользователя в devise и в то же время создать новый объект Company. Связь между ними: Пользователь принадлежит Компании. У компании много пользователей. Я попытался сделать это на основе этой ссылки : http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast , но это не сработало. в нем говорилось: «неопределенный метод для компании», то есть у компании нет атрибута электронной почты. и в форме регистрации я указываю только атрибут электронной почты для пользователя

 <div class="title"><%= t('.signup') %></div>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>

<div class="control-group"><%= f.label :email, t('.email') %>
<%= f.email_field :email %></div>

<div class="control-group"><%= f.label :password, t('.password') %>
<%= f.password_field :password %></div>

<div class="control-group"><%= f.label :password_confirmation, t('.password_confirmation') %>
<%= f.password_field :password_confirmation %></div>

<%= f.fields_for :company_attributes do |f_company| %>

<div class="control-group"><%= f_company.label :name, t('.company_name') %>
<%= f_company.text_field :name %></div>

<% end %>

<div class="buttons"><%= f.submit t('.signup'), class:"btn btn-primary" %><br>
<%= render "links" %></div>
<% end %>
  

обновленный

Контролер компании :

 class CompaniesController < Devise::RegistrationsController

def new
  @company = Company.new
  @user = @company.users.build
end

def create
  @company = Company.new(params[:company])
  @user = User.create(params[:user].merge(company_id:company.id))
  if @company.save
   redirect_to "/"
  else
   render 'users/sign_up'
 end
 end
end
  

Пользовательский Контроллер :

   def new
    @user = User.new
  end
  def create
    @user = User.new(params[:user]) 
    if @user.save
      redirect_to users_path
    else
      render 'users/new'
    end
  end
  

Я был бы очень признателен за любую идею и любую помощь. Заранее спасибо

Комментарии:

1. Можете ли вы опубликовать код своего контроллера?

2. @Kyle я обновил свой вопрос кодом двух контроллеров

Ответ №1:

В вашем случае, поскольку вы заинтересованы только в получении имя_компании, я бы упростил это и отправил имя_компании через text_field_tag .

Другими словами, я бы заменил:

 <%= f.fields_for :company_attributes do |f_company| %>

<div class="control-group"><%= f_company.label :name, t('.company_name') %>
<%= f_company.text_field :name %></div>

<% end %>
  

С помощью этого

 <%= text_field_tag 'company_name', {placeholder:"Enter here the name of your company",class:"form-control"} %>
  

Это отправило бы имя в UsersController , и вы могли бы получить к нему доступ с помощью params[:company_name] , поэтому контроллер выглядел бы так:

Пользовательский контроллер:

  def new
    @user = User.new
  end
  def create
    @user = User.create(params[:user]) 
    #Create a company via 'user<->company' association using 'company_name'
    @company= @user.company.create(name: params[:company_name])
    if @user.save
      redirect_to users_path
    else
      render 'users/new'
    end
  end