DDD*_*DDD 3 ruby if-statement ruby-on-rails ruby-on-rails-3
我的Ruby on Rails 3控制器有一个简单的If Else语句似乎不起作用.
我的发言:
def create
if @trained = Certificate.where(user_id: params[:certificate][:user_id])
@trained.first.update_attributes(attend: "Yes")
else
@trained = Certificate.new(params[:certificate])
if @trained.save
@trained.update_attributes(attend: "Yes")
end
end
redirect_to grandstreamers_resellers_path
end
Run Code Online (Sandbox Code Playgroud)
这是带有错误的日志,'update_attributes'的NoMethodError,但是这行不应该运行,因为它找不到带有user_id'1'的证书.为什么不做else语句呢?
Started POST "/certificates" for 50.241.102.234 at 2014-01-06 07:01:55 -0800
Processing by CertificatesController#create as HTML
Parameters: {"utf8"=>"?", "authenticity_token"=>"TM6GPqslIs013O+mOuxGXyyD90T2O5lSZmnqKTFPwVw=", "certificate"=>{"user_id"=>"1"}, "commit"=>"Train"}
Certificate Load (0.1ms) SELECT `certificates`.* FROM `certificates` WHERE `certificates`.`user_id` = 1 LIMIT 1
Completed 500 Internal Server Error in 1ms
NoMethodError (undefined method `update_attributes' for nil:NilClass):
app/controllers/certificates_controller.rb:5:in `create'
Run Code Online (Sandbox Code Playgroud)
该where子句永远不会返回nil,它返回一个ActiveRecord :: Relation对象,它可以为空!
试试这个:
def create
if @trained = Certificate.where(user_id: params[:certificate][:user_id]).first
@trained.update_attributes(attend: "No")
else
@trained = Certificate.new(params[:certificate])
if @trained.save
@trained.update_attributes(attend: "Yes")
end
end
redirect_to grandstreamers_resellers_path
end
Run Code Online (Sandbox Code Playgroud)
但我会重构我的代码到这样的事情:
def create
@trained = Certificate.where(user_id: params[:certificate][:user_id]).first
@trained ||= Certificate.new(params[:certificate])
if @trained.persisted? # tests if the records is persisted in the DB (has an ID)
@trained.attend = "No"
else
@trained.attend = "Yes"
end
@trained.save
redirect_to grandstreamers_resellers_path
end
Run Code Online (Sandbox Code Playgroud)
非常短的版本:
def create
@trained = Certificate.where(user_id: params[:certificate][:user_id]).first || Certificate.new(params[:certificate])
@trained.attend = @trained.persisted? ? "No" : "Yes"
@trained.save
redirect_to grandstreamers_resellers_path
end
Run Code Online (Sandbox Code Playgroud)
有关记录(@NitinJ请看一下),您可以在if条件中分配变量:
if first_user = User.first
# if User.first does not returns nil, executes the first block with local variable first_user available
first_user.id
else
# User.first returned nil
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |