Вызов двух методов из одного контроллера в форме вложенной модели - PullRequest
0 голосов
/ 30 августа 2011

Из других публикаций на SO я узнал, что мой процесс регистрации с использованием формы вложенной модели имеет недостатки: я создаю новый User, а затем перенаправляю его на создание Profile. Вот процесс:

user = User.new
user.email = ...
user.password = ...
user.profile = Profile.new
user.profile.first_name = ...
...
user.profile.save
user.save

Похоже, что одним из решений является инициирование метода профиля из действия UsersController create (?), Чтобы я POST для обеих моделей (?) Затем перенаправлял на страницу с формой для заполнения остальных профиля.

Но я не совсем уверен, как это сделать, так как я новичок в программировании / Rails. Так может ли кто-нибудь дать мне руководство о том, как ввести метод Profile в UsersController? Я попробовал, но не думаю, что это правильно. Код для обоих пользователей / ProfilesController ниже:

Пользователь:

def new
  @user = User.new
  @user.profile = Profile.new
end

def index
  @user = User.all
end

def create
  @user = User.new(params[:user])
  if @user.profile.save
    redirect_to profile_new_path, :notice => 'User successfully added.'
  else
    render :action => 'new'
  end
end

Профиль:

def new
  @user.profile = Profile.new
end

def create
  @profile = Profile.new(params[:profile])
  if @profile.save
    redirect_to profile_path, :notice => 'User successfully added.'
  else
    render :action => 'new'
  end
end

routes.rb:

match '/signup' => 'profiles#new', :as => "signup"
get "signup" => "profiles#new", :as => "signup"
root :to => 'users#new'
resources :users
resources :profiles

Форма моей вложенной модели (соответствующие части):

<%= form_for(:user, :url => { :action => :create }, :html => {:id => 'homepage'}) do |f| %>
  <%= f.text_field :email, :size=> 13, :id => "user[email]" %>
  <%= f.fields_for :profile do |f| %>
  <% end%>
<% end %>

Если бы кто-нибудь мог мне помочь, я был бы очень признателен.

1 Ответ

1 голос
/ 30 августа 2011

В ваших моделях должно быть что-то подобное:

class User < ActiveRecord::Base
  has_one :profile
  accepts_nested_attributes_for :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

... конечно, все подкреплено правильной миграцией. Тогда при создании формы вы можете использовать fields_for помощник. Вот слегка измененный пример из документации:

<%= form_for @user do |user_form| %>
  Email: <%= user_form.text_field :email %>
    <%= user_form.fields_for :profile do |profile_fields| %>
      First Name: <%= profile_fields.text_field :first_name %>
  <% end %>
<% end %>

И обновите своего пользователя и его профиль в контроллере за один раз, благодаря объявлению accepts_nested_attributes_for :profile в вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...