如何检查模型是否存在,如果不存在,如何创建?

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 等.