我是Rails的新手。我正在构建一个具有用户模型和配置文件模型的应用程序。在Rails中关联两个模型(用户和配置文件)
我想这些模型相关联,使得:
- 用户创建一个帐户后,他被自动发送到“创建个人资料”页面,他创建的配置文件连接到只有特定的用户。
- 只有拥有该配置文件的用户才能对其进行编辑。
我使用nifty_generators生成的用户模型。当用户点击提交以创建帐户时,我将他重定向到“新的个人资料”视图以创建个人资料。我通过编辑用户控制器中的重定向路径来做到这一点。用户控制器看起来是这样的:
def create
@user = User.new(params[:user])
if @user.save
session[:user_id] = @user.id
flash[:notice] = "Thank you for signing up! You are now logged in."
redirect_to new_profile_path
else
render :action => 'new'
end
end
这是工作,但问题是,应用程序似乎并没有认识到的个人资料被连接到特定的用户。我能够创建配置文件,但配置文件和用户之间似乎没有关系。
我的剖面模型的列表:belongs_to的:用户
我的用户模型列表:有_ONE:简介
我的routes.rb文件列出如下:
map.resources:用户:HAS_ONE =>:简介
map.resources:配置文件
我在配置文件表中有一个user_id外键。我的模式是这样的:
create_table "profiles", :force => true do |t|
t.integer "user_id"
t.string "name"
t.string "address1"
t.string "address2"
t.string "city"
t.string "state"
t.string "zip"
t.string "phone"
t.string "email"
t.string "website"
t.text "description"
t.string "category"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", :force => true do |t|
t.string "username"
t.string "email"
t.string "password_hash"
t.string "password_salt"
t.datetime "created_at"
t.datetime "updated_at"
end
要尽量配置文件连接到用户,我更新了;下面,我基本上是从Rails的外推入门指南profiles_controller.rb文件。我的想法是,在我的应用程序中,配置文件以与Rails入门应用程序相同的方式连接到用户,评论连接到帖子。这是我的配置文件控制器的相关部分。我可以提供,如果这将有助于整个事情:
def new
@user = User.find(params[:user_id])
@profile = @user.profile.build
end
def create
@user = User.find(params[:user_id])
@profile = @user.profile.build(params[:profile])
if @profile.save
flash[:notice] = 'Profile was successfully created.'
redirect_to(@profile)
else
flash[:notice] = 'Error. Something went wrong.'
render :action => "new"
end
末
使得这些更新配置文件控制器后,现在当我的帐户创建屏幕上提交,我重定向到一个错误页面上面写着:
的ActiveRecord :: RecordNotFound在ProfilesController#新
找不到用户没有ID
这一切都似乎是一个非常直接的Rails的使用情况,但我不确定哪些部分是错误的。在此先感谢您的帮助!
谢谢,泰特。我遵循你的建议,然后遇到了一些其他的错误,我一直试图通过我自己的工作。我现在再次卡住了。当我在创建用户时单击提交时,它会将我指向localhost:3000/users/5/profile/new。 但我得到的trace页面如下: ProfilesController中的NoMethodError#new 当你没有想到它时,你有一个无对象! 评估nil.build时发生错误 跟踪表示它在配置文件控制器中断了 - 新的配置文件方法。 DEF新 @user = User.find(PARAMS [:USER_ID]) @profile = @ user.profile.build 端 想法? – MikeH 2009-08-20 02:31:16
这是一条糟糕的路线。除非你真的有一个很好的理由,否则你应该同时创造两个。我指的是我的答案。 – nitecoder 2009-08-20 04:48:50
'object.association.build'是一个关联集合。单数关联应该使用'object.build_association',其中关联是关联模型的名称。如果你有疑问,你应该启动轨道控制台并试验它的工作原理 正如@railsninja指出的,你真的应该考虑完成两种形式的用户体验。无论如何,这对于嵌套关联来说是非常有效的解决方案。 – 2009-08-20 05:30:13