2009-08-19 62 views
3

我是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的使用情况,但我不确定哪些部分是错误的。在此先感谢您的帮助!

回答

0

为了便于使用,配置文件应该是用户模型的一部分,或者您应该创建您的帐户,并至少将您的配置文件的基础一次性创建,作为我注册的用户,然后必须填写另一个表单我想我会非常恼火。

这样做的好处是,无论哪种方式,你可以用一种形式做到这一点。我会看看complex forms上的railscasts,如果你能够处理非常低的财务费用,那么Mastering Rails Forms上的实用程序员系列是完全胜利者。

4

创建用户时,客户端将被重定向到中的new操作,而不需要id。您需要在参数中明确传递用户的id。将引用传递给整个对象是一种习惯用法,而不仅仅是id。

# app/controllers/users_controller.rb 

def create 
    # ... 
    redirect_to new_user_profile_path(:user_id => @user) 
    # ... 
end 

请注意,我用new_user_profile_path,而不是new_profile_path。前者是您在routes.rb中定义的嵌套资源。您应该删除map.resources :profiles,因为没有用户,配置文件不能存在。

+0

谢谢,泰特。我遵循你的建议,然后遇到了一些其他的错误,我一直试图通过我自己的工作。我现在再次卡住了。当我在创建用户时单击提交时,它会将我指向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

+0

这是一条糟糕的路线。除非你真的有一个很好的理由,否则你应该同时创造两个。我指的是我的答案。 – nitecoder 2009-08-20 04:48:50

+1

'object.association.build'是一个关联集合。单数关联应该使用'object.build_association',其中关联是关联模型的名称。如果你有疑问,你应该启动轨道控制台并试验它的工作原理 正如@railsninja指出的,你真的应该考虑完成两种形式的用户体验。无论如何,这对于嵌套关联来说是非常有效的解决方案。 – 2009-08-20 05:30:13

0

因为user_id不存在或不在配置文件数据库中创建。创建用户时

相关问题