2016-10-11 16 views
0

這樣做的最好方法是什麼?是否應該將字符串條件方法添加到助手或模型或...?

我在這個視圖<%= badges(challenge) %><%= challenge.badges %>取決於我是否把badges放在助手或模型中。

我被告知把它放進一個幫手。我把它放在這樣的:

module ChallengesHelper 
    def badges(challenge) 
    if challenge.name == "Read 20 Min" 
     ActionController::Base.helpers.image_tag("read.png", class: "gold-star") 
    elsif challenge.name == "Exercise 20 Min" 
     ActionController::Base.helpers.image_tag("exercise.png", class: "gold-star") 
    elsif challenge.name == "Meditate 10 Min" 
     ActionController::Base.helpers.image_tag("meditate.png", class: "gold-star") 
    elsif challenge.name == "Stretch 5 Min" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Write 500 Words" 
     ActionController::Base.helpers.image_tag("write.png", class: "gold-star") 
    elsif challenge.name == "Walk 5,000 Steps" 
     ActionController::Base.helpers.image_tag("walk.png", class: "gold-star") 
    elsif challenge.name == "Eat Fruit & Veg" 
     ActionController::Base.helpers.image_tag("fruit-and-vegetable.png", class: "gold-star") 
    elsif challenge.name == "Plan Day" 
     ActionController::Base.helpers.image_tag("plan.png", class: "gold-star") 
    elsif challenge.name == "After Waking, Guzzle Water" 
     ActionController::Base.helpers.image_tag("water.png", class: "gold-star") 
    elsif challenge.name == "Track Food Consumption" 
     ActionController::Base.helpers.image_tag("track-food.png", class: "gold-star") 
    elsif challenge.name == "Random Act of Kindness" 
     ActionController::Base.helpers.image_tag("random-kindness.png", class: "gold-star") 
    elsif challenge.name == "Write 3 Gratitudes" 
     ActionController::Base.helpers.image_tag("gratitude.png", class: "gold-star") 
    elsif challenge.name == "Juice Fast" 
     ActionController::Base.helpers.image_tag("juice.png", class: "gold-star") 
    elsif challenge.name == "Not Smoke" 
     ActionController::Base.helpers.image_tag("not-smoke.png", class: "gold-star") 
    elsif challenge.name == "Not Drink Alcohol" 
     ActionController::Base.helpers.image_tag("not-drink.png", class: "gold-star") 
    # GOAL CHALLENGES 
    elsif challenge.name == "Live Abroad" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Long Road Trip" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Tour Capital Building" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Karaoke" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "See New York Skyline" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Run 5K" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Write Memoir" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Lose 10 Pounds" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Join Club" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Skydive" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Start a Blog" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Donate $100 to Charity" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Create Independent Income Stream" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Paint a Picture" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif challenge.name == "Give a Public Speech" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    else 
     ActionController::Base.helpers.image_tag("gold-star-maze.png", class: "gold-star") 
    end 
    end 
end 

我只關心,因爲它看起來比模型更幫助「羅嗦」。

def badges 
    if name == "Read 20 Min" 
     ActionController::Base.helpers.image_tag("read.png", class: "gold-star") 
    elsif name == "Exercise 20 Min" 
     ActionController::Base.helpers.image_tag("exercise.png", class: "gold-star") 
    elsif name == "Meditate 10 Min" 
     ActionController::Base.helpers.image_tag("meditate.png", class: "gold-star") 
    elsif name == "Stretch 5 Min" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Write 500 Words" 
     ActionController::Base.helpers.image_tag("write.png", class: "gold-star") 
    elsif name == "Walk 5,000 Steps" 
     ActionController::Base.helpers.image_tag("walk.png", class: "gold-star") 
    elsif name == "Eat Fruit & Veg" 
     ActionController::Base.helpers.image_tag("fruit-and-vegetable.png", class: "gold-star") 
    elsif name == "Plan Day" 
     ActionController::Base.helpers.image_tag("plan.png", class: "gold-star") 
    elsif name == "After Waking, Guzzle Water" 
     ActionController::Base.helpers.image_tag("water.png", class: "gold-star") 
    elsif name == "Track Food Consumption" 
     ActionController::Base.helpers.image_tag("track-food.png", class: "gold-star") 
    elsif name == "Random Act of Kindness" 
     ActionController::Base.helpers.image_tag("random-kindness.png", class: "gold-star") 
    elsif name == "Write 3 Gratitudes" 
     ActionController::Base.helpers.image_tag("gratitude.png", class: "gold-star") 
    elsif name == "Juice Fast" 
     ActionController::Base.helpers.image_tag("juice.png", class: "gold-star") 
    elsif name == "Not Smoke" 
     ActionController::Base.helpers.image_tag("not-smoke.png", class: "gold-star") 
    elsif name == "Not Drink Alcohol" 
     ActionController::Base.helpers.image_tag("not-drink.png", class: "gold-star") 
    # GOAL CHALLENGES 
    elsif name == "Live Abroad" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Long Road Trip" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Tour Capital Building" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Karaoke" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "See New York Skyline" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Run 5K" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Write Memoir" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Lose 10 Pounds" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Join Club" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Skydive" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Start a Blog" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Donate $100 to Charity" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Create Independent Income Stream" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Paint a Picture" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    elsif name == "Give a Public Speech" 
     ActionController::Base.helpers.image_tag("stretch.png", class: "gold-star") 
    else 
     ActionController::Base.helpers.image_tag("gold-star-maze.png", class: "gold-star") 
    end 
    end 

爲什麼一個點比另一個好?對於類似這樣的情況,最好的做法是在哪些條件下有很多字符串條件?

回答

4

最好方式將只是刪除這個可怕的方法,並將映射直接存儲在模型(因爲它看起來很靜態)。事情是這樣的:

Challenge.create(name: 'Read 20 Min', badge: 'read.png') 

和輔助方法變得簡單多了

def badge_tag(challenge) 
    ActionController::Base.helpers.image_tag(challenge.badge, class: "gold-star") 
end 

就是這樣。

可能把這個方法放在模型中,但你不應該,因爲它是純粹的表示邏輯,與模型無關。我,我會在這裏使用presenter而不是幫手。

1

在我看來,在助手中有這樣的事情要好得多。模型中的代碼較少,您應該只有模型本身需要的邏輯。這是邏輯的觀點不是模型本身,所以這就是爲什麼助手在那裏。

第二,更好用case whenif elsif. 你可以嘗試使用draper gem。 Draper

1

您可以採取幾個步驟來使其更加結構化。

  1. 首先,正如其他人所說的代碼生成的視圖代碼,並不屬於模型,所以它在幫手更有意義。

  2. DRY。

而不是

if name == "Read 20 Min" 
       ActionController::Base.helpers.image_tag("read.png", class: "gold-star") 
    . 
    . 
    . 

應該只設置被修改,並有通話在單行屬性...

if name == "Read 20 Min" 
     image = "read.png" 
else 
. 
. 
end 

ActionController::Base.helpers.image_tag(image, class: "gold-star") 

這將是更容易維護,例如你可能決定改變這個類,只需要修改這一行。

  1. 考慮將圖像名稱添加到挑戰模型中,那麼根本不需要測試任何描述。
1

另一種方式來保持你的助手這段代碼,將宣佈一個常量的哈希,並用它來避免switchif S:

module ChallengesHelper 
    CHALLENGE_IMAGES = { 
    'Read 20 Min' => 'read.png', 
    'Exercise 20 Min' => 'exercise.png', 
    'Meditate 10 Min' => 'meditate.png', 
    'Stretch 5 Min' => 'stretch.png', 
    'Write 500 Words' => 'write.png', 
    'Walk 5,000 Steps' => 'walk.png', 
    'Eat Fruit & Veg' => 'fruit-and-vegetable.png', 
    'Plan Day' => 'plan.png', 
    'After Waking, Guzzle Water' => 'water.png', 
    'Track Food Consumption' => 'track-food.png', 
    'Random Act of Kindness' => 'random-kindness.png', 
    'Write 3 Gratitudes' => 'gratitude.png', 
    'Juice Fast' => 'juice.png', 
    'Not Smoke' => 'not-smoke.png', 
    'Not Drink Alcohol' => 'not-drink.png', 
    'Live Abroad' => 'stretch.png', 
    'Long Road Trip' => 'stretch.png', 
    'Tour Capital Building' => 'stretch.png', 
    'Karaoke' => 'stretch.png', 
    'See New York Skyline' => 'stretch.png', 
    'Run 5K' => 'stretch.png', 
    'Write Memoir' => 'stretch.png', 
    'Lose 10 Pounds' => 'stretch.png', 
    'Join Club' => 'stretch.png', 
    'Skydive' => 'stretch.png', 
    'Start a Blog' => 'stretch.png', 
    'Donate $100 to Charity' => 'stretch.png', 
    'Create Independent Income Stream' => 'stretch.png', 
    'Paint a Picture' => 'stretch.png', 
    'Give a Public Speech' => 'stretch.png' 
    }.freeze 

    def badges(challenge) 
    ActionController::Base.helpers.image_tag(CHALLENGE_IMAGES[challenge] || 'gold-star-maze.png', class: "gold-star") 
    end 
end 
相關問題