在create action中创建或新建Rails控制器

时间:2013-01-28 15:18:36

标签: ruby-on-rails

在Rails中,我们定义create动作2种方式。有什么区别?

def create
  @shop = Shop.new(params[:shop])
  if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

# or

def create
  @shop = Shop.create(params[:shop])
  if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

考虑到我们已经拥有:

def new
  @shop = Shop.new
end

哪个更合适?

4 个答案:

答案 0 :(得分:2)

第一种方式不符合您的期望:

def create
  @shop = Shop.new(params[:shop]) # This won't create a new record on Shops table unless...
  @show.save                      # ...you do this
end

def create
  @shop = Shop.create(params[:shop]) # This will create a new record if everything is fine
  if @shop.save # This is redundant
    # ...
  end
end

调用create然后调用save是多余的。如果验证不成功,create方法将尝试创建新记录并以静默方式失败。另一方面,save将尝试创建新记录,但如果vaildations失败则返回nil,因此您可以在 if / else 块中使用它。

答案 1 :(得分:2)

def new操作仅适用于New视图(new控制器中的Shop操作与app/views/shop/new.html.erb文件对应) - 它不会不做任何创作:

def new
  @shop = Shop.new
end

在该操作中未提及params[:shop],因为参数尚不存在 - 这就是您在New视图中收集的内容。

您的def create操作是实际创建数据库条目的操作:

def create
  @shop = Shop.new(params[:shop])
  if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

您使用的是.new而不是.create,因此您可以进行验证。此外,Shop.new调用实际上并不创建记录 - 它是@shop.save执行此操作。

答案 2 :(得分:2)

如果您使用Model.create,则无需明确保存对象。 create方法将为您完成。 如果使用Model.new,则需要通过执行@ object.save来保存对象。新的 方法不适合你。

使用Model.new:

def create
  @shop = Shop.new(params[:shop])
   if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

使用Model.create:

def create
  @shop = Shop.create(params[:shop])
   # if @shop.save (This is not required)
  if @shop 
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

答案 3 :(得分:1)

create控制器操作中,Shop.new没有关注@shop.save就没用了。通常它被分成这两个步骤来处理验证错误。我们使用来自用户的数据来购物。如果数据还可以,我们会保存商店。如果存在验证错误,我们会告诉用户再试一次。

或者我们需要在将记录保存到数据库之前进行一些复杂的属性初始化。

@user = User.new params[:user]
@user.reputation = fetch_reputation_from_stackoverflow

if @user.save
  # the usual steps here

RE:问题编辑

  

考虑到我们已经拥有:

def new
  @shop = Shop.new
end

new行动中的内容完全无关紧要。如果您的验证可能失败(或者您的模型可能无法成功创建),请使用new + save对。如果您确定输入数据正常并且模型将始终保存,则仅使用createsave以下是多余的)。