从嵌套模型表单中的一个控制器调用两个方法

时间:2011-08-30 03:42:23

标签: ruby-on-rails-3 post nested-forms

通过SO上的其他帖子我了解到,使用嵌套模型表单的注册过程存在缺陷,因为我创建了一个新的User,然后重定向以创建其Profile。这是过程:

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

似乎一个解决方案是从UsersController创建(?)操作中启动配置文件方法,以便我向两个模型POST(?)然后重定向到带有要填写的表单的页面其余的个人资料。

但我不完全确定如何做到这一点,因为我是编程/ Rails的新手。那么,任何人都可以就如何在Profile中引入UsersController方法向我提供指导吗?我试了一下,但不认为这是正确的。以下用户/个人资料控制器的代码:

用户:

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 个答案:

答案 0 :(得分:1)

你的模特应该有这样的东西:

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

class Profile < ActiveRecord::Base
  belongs_to :user
end

...当然所有备份都有适当的迁移。然后在构建表单时,您可以使用fields_for帮助程序。以下是docs中的略微修改示例:

<%= 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声明,您可以一次性更新控制器中的用户及其个人资料。