在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
哪个更合适?
答案 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
考虑到我们已经拥有:
def new
@shop = Shop.new
end
new
行动中的内容完全无关紧要。如果您的验证可能失败(或者您的模型可能无法成功创建),请使用new
+ save
对。如果您确定输入数据正常并且模型将始终保存,则仅使用create
(save
以下是多余的)。