หนึ่งบรรทัดถ้าข้อความไม่ทำงาน


192
<%if @item.rigged %>Yes<%else%>No<%end%>

ฉันคิดถึงสิ่งนี้

if @item.rigged ? "Yes" : "No" 

แต่มันไม่ทำงาน ทับทิมมี||=แต่ฉันไม่แน่ใจด้วยซ้ำว่าจะใช้สิ่งนั้นอย่างไร


มันไม่ชัดเจนว่าสายไหนใช้ไม่ได้ (หรือทั้งคู่?)
ymoreau

คำตอบ:


401

ลบออกifจากif @item.rigged ? "Yes" : "No"

ผู้ประกอบการที่สามมีรูปแบบ condition ? if_true : if_false


1
หากเงื่อนไขของคุณลงท้ายด้วย '?' เป็นไปได้ที่จะวางหรือไม่ คือถ้ามีเงื่อนไข @ customer.sales.present? คุณสามารถวาง '?' ... ไม่ต้องกังวล พบรหัสที่ฉันมีและทดสอบ คำตอบคือ 'ไม่'
Jay Killeen

@JayKilleen คุณถูกต้อง ทับทิมเป็นข้อมูลเกี่ยวกับเทคนิคฉลาด แต่มันเป็นเรื่องที่ฉลาด (:
Nikita Rybak

1
@NikitaRybak s/that/not that :)
Austin

180

ใน Ruby เงื่อนไขและthenส่วนของifนิพจน์ต้องถูกคั่นด้วยตัวคั่นนิพจน์ (เช่น;หรือขึ้นบรรทัดใหม่) หรือthenคำสำคัญ

ดังนั้นสิ่งเหล่านี้จะได้ผล:

if @item.rigged then 'Yes' else 'No' end

if @item.rigged; 'Yes' else 'No' end

if @item.rigged
  'Yes' else 'No' end

นอกจากนี้ยังมีโอเปอเรเตอร์ที่มีเงื่อนไขใน Ruby แต่ไม่จำเป็นอย่างสมบูรณ์ จำเป็นต้องใช้โอเปอเรเตอร์ตามเงื่อนไขใน C เนื่องจากเป็นโอเปอเรเตอร์: ใน C ifเป็นคำสั่งและไม่สามารถส่งคืนค่าได้ดังนั้นหากคุณต้องการส่งคืนค่าคุณต้องใช้สิ่งที่สามารถคืนค่าได้ และสิ่งเดียวใน C ที่สามารถส่งคืนค่าคือฟังก์ชั่นและตัวดำเนินการและเนื่องจากมันเป็นไปไม่ได้ที่จะสร้างifฟังก์ชั่นใน C คุณจึงต้องมีโอเปอเรเตอร์

อย่างไรก็ตามใน Ruby ifเป็นนิพจน์ ในความเป็นจริงทุกอย่างคือการแสดงออกในรูบีจึงอยู่แล้วสามารถกลับค่า ไม่มีความจำเป็นสำหรับผู้ประกอบการที่มีเงื่อนไขที่จะได้ไม่เป็นที่มีอยู่ให้อยู่คนเดียวใช้มัน

BTW: มันเป็นธรรมเนียมของวิธีการตั้งชื่อซึ่งใช้ในการถามคำถามที่มีเครื่องหมายคำถามในตอนท้ายดังนี้:

@item.rigged?

สิ่งนี้แสดงให้เห็นปัญหาอื่นเกี่ยวกับการใช้ตัวดำเนินการเงื่อนไขใน Ruby:

@item.rigged? ? 'Yes' : 'No'

เป็นการยากที่จะอ่านด้วยเครื่องหมายคำถามหลาย ๆ ตัวที่อยู่ติดกัน


74

หนึ่งบรรทัดถ้า:

<statement> if <condition>

กรณีของคุณ:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged

14
หรือ"No" unless @item.riggedเพื่อป้องกันการ!
Veger

วิธีการแก้ปัญหานี้อยู่ในที่แตกต่างกันก็จะส่งกลับnilแทน'Yes'ถ้าitem.riggedเป็นความจริง บรรทัดเดียวถ้าหรือถ้าคำสั่งกลับnilถ้าเงื่อนไขไม่เป็นไปตาม
The Pellmeister

23

จากสิ่งที่ฉันรู้

3 หนึ่งสมุทร

  1. a = 10 if <condition>

ตัวอย่าง:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

ตัวอย่าง:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

ตัวอย่าง:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

ฉันหวังว่ามันจะช่วย


2
สุนัขนี่เป็นคำตอบที่ดีที่สุด - ฉันชอบความชัดเจนทั้งสามวิธี ขอบคุณ!
MrVocabulary

7

ทั้งการสร้างเชลล์และ C แบบบรรทัดเดียว (ruby 1.9.3p429):

# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"

# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"

ตัวอย่างที่สองเท่านั้นคือ ruby ​​สำนวน
sekmo

7

หากเงื่อนไขอื่นสามารถครอบคลุมกับผู้ประกอบการที่ประกอบไปด้วย

@item.rigged? ? 'Yes' : 'No'

2

เพื่อความง่ายถ้าคุณต้องใช้ค่าเริ่มต้นถ้าไม่มีคุณสามารถใช้:

@something.nil? = "No" || "Yes"

1

คุณสามารถใช้ได้ ----

(@ item.rigged)? "ใช่ไม่ใช่"

หาก @ item.rigged เป็นจริงมันจะส่งคืน 'ใช่' มิฉะนั้นจะส่งคืน 'ไม่'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.