gpt4 book ai didi

ruby-on-rails - rails : first_or_create not saving

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

我的应用程序的目标是仅显示包含现有数据的表单页面或新的空白表单。我通过使用在创建用户时创建空白记录的回调来完成此操作。

用户模型:

before_create :build_health_profile

但是,如果出于某种原因,用户“health_profile”被销毁或不存在,它会破坏我的整个应用程序:

"nil:NilClass 的未定义方法 `health_profile'"

有人向我提到“first_or_create”方法可以通过显示新表单或查找现有表单来解决此问题,但我无法保存字段。它通过我的保存警报定向到我的根目录,就像它已保存一样,但实际上没有保存任何内容。

Controller :

class HealthProfilesController < ApplicationController

def new
@health_profile = current_user.build_health_profile
end

def create
@health_profile = HealthProfile.where(user_id: current_user).first_or_create(health_profile_params)
if @health_profile.save
flash[:success] = "Health profile saved."
redirect_to root_path
else
render 'new'
end
end

private

def health_profile_params
params.require(:health_profile).permit(
:age,
:weight,
:height,
:gender
)
end
end

我已经看到我可以在哪里使用 block 来“first_or_create”,但没有运气让它起作用。

查看:

<%= link_to "Health Profile", new_health_profile_path %>

型号:

class User < ActiveRecord::Base
has_one :health_profile, dependent: :destroy
end

class HealthProfile < ActiveRecord::Base
belongs_to :user
end

最佳答案

如果您使用 first_or_create然后调用 save 方法作为记录的一部分,并尝试将其保存在数据库中。如果无法保存记录,则事务回滚。所以,你想使用:first_or_initialize这里就像 new 并且不会立即将记录保存在数据库中。它只是加载数据。因此,您可以在代码的下一行调用 save

所以,在你的代码中,你有:

 @health_profile = HealthProfile.where(user_id: current_user).first_or_create(health_profile_params)

这里你没有控制 save 部分,这已经由 first_or_create 方法完成了。

因此,您实际上只想使用 first_or_initialize 加载对象(尚未保存):

 @health_profile = HealthProfile.where(user_id: current_user).first_or_initialize(health_profile_params)

然后,在下一行中,您可以调用 save 并根据它的返回值做出决定:

if @health_profile.save
# do stuff if successfully saved health_profile
else
# otherwise
render 'new'
end

关于ruby-on-rails - rails : first_or_create not saving,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32104939/

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