gpt4 book ai didi

ruby-on-rails - 在 Rails 中关联两个模型(用户和配置文件)

转载 作者:行者123 更新时间:2023-12-04 06:22:28 25 4
gpt4 key购买 nike

我是 Rails 新手。我正在构建一个具有用户模型和配置文件模型的应用程序。

我想将这些模型关联起来:
- 用户创建帐户后,他会自动转到“创建个人资料”页面,他创建的个人资料仅与该特定用户相关联。
- 只有拥有个人资料的用户才能编辑它。

我使用 nifty_generators 生成了用户模型。当用户点击提交以创建帐户时,我将他重定向到“新配置文件” View 以创建配置文件。我通过在用户 Controller 中编辑重定向路径来做到这一点。用户 Controller 如下所示:

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 :user
我的用户模型列表:有 _one :profile

我的 routes.rb 文件列出了以下内容:
map.resources :users, :has_one => :profile
map 资源:配置文件

我在配置文件表中有一个 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

为了尝试将配置文件连接到用户,我用以下内容更新了 profiles_controller.rb 文件,我基本上是从 Rails 入门指南中推断出来的。我的想法是,在我的应用程序中,配置文件连接到用户的方式与在 Rails 入门应用程序中评论连接到帖子的方式相同。这是我的配置文件 Controller 的相关部分。如果有帮助,我可以提供全部内容:

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

结束

在对配置文件 Controller 进行这些更新后,现在当我在帐户创建屏幕上提交时,我被重定向到一个错误页面,上面写着:

ProfilesController 中的 ActiveRecord::RecordNotFound#new
找不到没有 ID 的用户

这一切看起来像是一个非常简单的 Rails 用例,但我不确定哪些部分是错误的。预先感谢您的帮助!

最佳答案

创建用户后,客户端将重定向到 ProfileController 中的 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,因为没有用户就无法存在配置文件。

关于ruby-on-rails - 在 Rails 中关联两个模型(用户和配置文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1298846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com