如何检查模型是否存在,如果不存在,如何创建?
How to look check whether model exists and create if it doesn't with a single form?
我正在尝试实现具有以下行为的表单:
1) 输入一些关于用户的语义数据(即用户名)。
2) 执行 User.find_by(:username = username)。
3)如果存在这样的用户,则直接显示该用户的页面。
4) 如果这样的用户不存在,使用提供的用户名创建一个新用户,然后重定向到该用户的显示页面。
这应该很简单,但我不知道如何格式化 form_for 助手和我的节目,并在我的 user_controller 中创建操作来实现此行为。
我目前有:
form_with :url => 'users/:id', :method => :get do
...
结束
因为我最终试图调用控制器的 "show" 方法。但是,我的表单没有将用户的 ID 作为参数,并且当用户尚不存在时,在提交表单时没有 :id 参数可供访问。
如何设置我的表单以在每种情况下重定向以显示,同时仍坚持上述逻辑?
您可以在用户的控制器创建操作中执行类似的操作
def create
usr_name = params[:username]
@user = User.where(username: usr_name).first_or_initialize
if @user.persisted?
redirect_to user_path(@user) # or whatever your user show path is
elsif @user.save
redirect_to user_path(@user)
else
render :new
end
end
您只需要确保您正在验证用户名的唯一性。
此外,first_or_initialize
(及其对应的 first_or_create
)可以接收一个块。因此,您可以像这样为新用户分配其他属性...
User.where(username: usr_name).first_or_initialize do |usr|
usr.some_attribute = some_value
end
您可以在创建中使用 find_or_initialize_by(unique_key) method.unique_key 可以是您用来识别用户的任何密钥,例如电子邮件,phone 等.
我正在尝试实现具有以下行为的表单:
1) 输入一些关于用户的语义数据(即用户名)。 2) 执行 User.find_by(:username = username)。 3)如果存在这样的用户,则直接显示该用户的页面。 4) 如果这样的用户不存在,使用提供的用户名创建一个新用户,然后重定向到该用户的显示页面。
这应该很简单,但我不知道如何格式化 form_for 助手和我的节目,并在我的 user_controller 中创建操作来实现此行为。
我目前有:
form_with :url => 'users/:id', :method => :get do ... 结束
因为我最终试图调用控制器的 "show" 方法。但是,我的表单没有将用户的 ID 作为参数,并且当用户尚不存在时,在提交表单时没有 :id 参数可供访问。
如何设置我的表单以在每种情况下重定向以显示,同时仍坚持上述逻辑?
您可以在用户的控制器创建操作中执行类似的操作
def create
usr_name = params[:username]
@user = User.where(username: usr_name).first_or_initialize
if @user.persisted?
redirect_to user_path(@user) # or whatever your user show path is
elsif @user.save
redirect_to user_path(@user)
else
render :new
end
end
您只需要确保您正在验证用户名的唯一性。
此外,first_or_initialize
(及其对应的 first_or_create
)可以接收一个块。因此,您可以像这样为新用户分配其他属性...
User.where(username: usr_name).first_or_initialize do |usr|
usr.some_attribute = some_value
end
您可以在创建中使用 find_or_initialize_by(unique_key) method.unique_key 可以是您用来识别用户的任何密钥,例如电子邮件,phone 等.