通过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 %>
如果有人能帮助我,我会非常感激。
答案 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
声明,您可以一次性更新控制器中的用户及其个人资料。