Ton*_*ony 7 ruby activerecord ruby-on-rails rescue
在Ruby on Rails应用程序中为对象编写"create"方法时,我使用了两种方法.我想使用一种方法,以便更清晰,更一致的代码.我将列出以下两种方法.有人知道一个人比另一个好吗?如果是这样,为什么?
方法1:
def create1
# is this unsecure? should we grab user_id from the session
params[:venue]['user_id'] = params[:user_id]
begin
venue = Venue.create(params[:venue])
@user_venues = @user.venues
render :partial => 'venue_select_box', :success => true, :status => :ok
rescue ActiveRecord::RecordInvalid
render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
end
end
Run Code Online (Sandbox Code Playgroud)
方法2:
def create2
# is this unsecure? should we grab user_id from the session
params[:venue]['user_id'] = params[:user_id]
venue = Venue.new(params[:venue])
if venue.save
@user_venues = @user.venues
render :partial => 'venue_select_box', :success => true, :status => :ok
else
render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
end
end
Run Code Online (Sandbox Code Playgroud)
class VenuesController < ApplicationController
def create
@venue = @user.venues.create!(params[:venue])
render :partial => 'venue_select_box', :success => true, :status => :ok
end
rescue_from ActiveRecord::RecordInvalid do
render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
end
end
Run Code Online (Sandbox Code Playgroud)
以这种方式使用@user.venues
可确保用户 ID 始终被正确设置。此外,ActiveRecord 将保护该:user_id
字段在调用过程中不被分配#create!
。因此,来自外部的攻击将无法修改:user_id
。
在测试中,您可以验证对 :create 执行 POST 是否会引发 ActiveRecord::RecordInvalid 异常。