- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 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/
我是一名优秀的程序员,十分优秀!