gpt4 book ai didi

ruby - Rails 正确使用 Unless with And 运算符

转载 作者:太空宇宙 更新时间:2023-11-03 18:16:37 26 4
gpt4 key购买 nike

我有一个 Rails 3.2.18 应用程序,我正在尝试使用以下方式将 Twilio 通知发送到医生的手机上进行更新操作:

 unless @call.call_status == "close" && @call.unit_ids.empty?

如果调用状态设置为关闭则意味着调用已关闭并且不需要通过 ActionMailer 或我的 send_sms 私有(private)方法发送通知。此外,如果 unit_ids 为空(单位数组),则不应发出邮件或短信警报。

事情是这样的。如果调用打开并且我没有分配任何单位(unit_ids 为空)并且我更新了调用,它将绕过操作邮件程序但它仍会尝试触发 send_sms 并为 @call.units.first.incharge 引发 nilclass 异常因为阵列中不存在 medic/incharge。现在,如果我在第一个语句中嵌套另一个 unless 语句(请参阅第二个示例,如果 call_status == close 和 unit_ids.empty,它不会触发 mailer 或 send_sms?

calls_controller.rb(不工作)

def update
parse_times!
@call = Call.find(params[:id])

respond_to do |format|
if @call.update_attributes(params[:call])
unless (@call.call_status == "close" && @call.unit_ids.empty?)
send_sms

@call.send_mail(:update_call)

end
format.html { redirect_to @call, notice: "Call #{@call.incident_number} was successfully updated.".html_safe }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @call.errors, status: :unprocessable_entity }
end
end
end

private
def send_sms
account_sid = 'AACCCCCC'
auth_token = 'ATttttt'
@client = Twilio::REST::Client.new account_sid, auth_token
@client.account.messages.create(
:from => '2814084444',
:to => @call.units.first.incharge.medic_phone,
:body => "incident_number #{@call.incident_number} patient name #{@call.patient_name}"
)
@client.account.messages.create(
:from => '2814084444',
:to => @call.units.first.attendant.medic_phone,
:body => "incident_number #{@call.incident_number} patient name #{@call.patient_name}"
)
end
end

calls_controller.rb(工作)

def update
parse_times!
@call = Call.find(params[:id])

respond_to do |format|
if @call.update_attributes(params[:call])
unless @call.call_status == "close"
unless @call.unit_ids.empty?
send_sms
end

@call.send_mail(:update_call)

end
format.html { redirect_to @call, notice: "Call #{@call.incident_number} was successfully updated.".html_safe }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @call.errors, status: :unprocessable_entity }
end
end
end

def send_sms
account_sid = 'ACCCCCC'
auth_token = 'atttt'
@client = Twilio::REST::Client.new account_sid, auth_token
@client.account.messages.create(
:from => '2814084444',
:to => @call.units.first.incharge.medic_phone,
:body => "incident_number #{@call.incident_number} patient name #{@call.patient_name}"
)
@client.account.messages.create(
:from => '2814084444',
:to => @call.units.first.attendant.medic_phone,
:body => "incident_number #{@call.incident_number} patient name #{@call.patient_name}"
)
end

嵌套 unless 语句是正确的方法吗,或者我能否以某种方式将 && 运算符与 unless 结合起来。也许我的语法在第一个(非工作)示例中是错误的。我显然在这里遗漏了一些东西,因此我们将不胜感激。

更新:08/03/14-08:03

似乎如果我使用 || operator 我不会引发 nilclass 异常,除非调用状态关闭或调用 unit_ids 为空,否则邮件程序和 send_sms 会触发。

 unless (@call.call_status == "close" || @call.unit_ids.empty?)
send_sms
@call.send_mail(:update_call)
end

这是否有意义,或者我应该尝试使用 && 运算符?

最佳答案

正如您正确观察到的那样,嵌套两个条件等同于将条件与 && 结合起来。因为 unless ...if 相同! ... (“如果不是”)你也可以这样写:

if !(@call.call_status == "close") && !(@call.unit_ids.empty?)
# ...
end

De Morgan's Law告诉我们 !a && !b!(a || b) 相同:

if !(@call.call_status == "close" || @call.unit_ids.empty?)
# ...
end

当然,我们可以用 unless 替换 if !:

unless @call.call_status == "close" || @call.unit_ids.empty?
# ...
end

尽管我更愿意建议您将 if 与复杂的条件一起使用,因为这通常更易于阅读和理解。我们从消除 unless 开始:

if !(@call.call_status == "close") && !(@call.unit_ids.empty?)
# ...
end

然后,我们重新表述 && 的左右部分,这样 ! 就不再需要了。这种情况下,我们可以将==改为!=。我们还可以将 empty? 更改为 any?,但是当数组仅包含 nil 和/或 false< 时,这会出现问题 值。如果您可以确定这永远不会发生,您可以使用 x.any? 而不是 ! x.empty? 还有:

if @call.call_status != "close" && !@call.unit_ids.empty?
# ...
end

# If you are 100% sure that @call.unit_ids _never_ contains nil or false values,
# you can use x.any? instead of !x.empty?

if @call.call_status != "close" && @call.unit_ids.any?
# ...
end

关于ruby - Rails 正确使用 Unless with And 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25104686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com