2013-02-28 51 views
0

我有這樣的代碼。是否有乾的方式來調用具有相同參數的不同Ruby方法?

if star 
    href = star_path(:"star[model]" => model.class, :"star[model_id]" => model.id)) 
else 
    href = unstar_path(:"star[model]" => model.class, :"star[model_id]" => model.id)) 
end 

正如您所看到的,它調用star_path或unstar_path helper,但使用相同的參數。我不喜歡重複這樣的參數,感覺應該有更好的方法。

謝謝!

+0

你能不能這樣做HREF = star_path( 「星[產品型號]」=> model.class, 「明星[MODEL_ID]」= > model.id,:star_unstar_boolean_flag => True) – Bala 2013-02-28 13:03:23

+0

我寧願將這些方法分開,因爲它們指向不同的地方,做不同的事情。 – superluminary 2013-02-28 15:29:48

回答

2
href = 
send(
    star ? :star_path : :unstar_path, 
    "star[model]".to_sym => model.class, "star[model_id]".to_sym => model.id 
) 
+1

Send是最通用的解決方案。謝謝 – superluminary 2013-02-28 15:31:16

+0

我想知道爲什麼superluminary的答案沒有被選中,如果我們談論的是普遍的目的性。他的答案更可讀。 – jvnill 2013-03-01 05:24:09

+0

因爲這是我自己的答案,從其他人中提煉出來。選擇我自己感到很粗魯。 – superluminary 2013-03-01 12:35:07

6

嘗試

options = { :"star[model]" => model.class, :"star[model_id]" => model.id } 

if star 
    href = star_path(options) 
else 
    href = unstar_path(options) 
end 
+0

這可能是最好的解決方案,當你擁有的只是一個選項散列。謝謝。 – superluminary 2013-03-01 12:38:25

+0

這不是乾的,但我會隨時隨地用'send'發送任何內容。 – 2013-10-18 21:11:50

3

兩種方式:

  • 分配給一個變量第一

    path_options = :"star[model]" => model.class, :"star[model_id]" => model.id 
    href = star ? star_path(path_options) : unstar_path(path_options) 
    
  • 使用自定義的助手

    def custom_star_path(options = {}) 
        action = options.delete(:action) || :star 
        action == :star ? star_path(options) : unstar_path(options) 
    end 
    

    ,並呼籲:

    custom_star_path(:action => (:unstar unless star), :"star[model]" => model.class, :"star[model_id]" => model.id) 
    

    或更簡單:

    def custom_star_path(options = {}) 
        options.delete(:has_star) ? star_path(options) : unstar_path(options) 
    end 
    
    custom_star_path(:has_star => star, :"star[model]" => model.class, :"star[model_id]" => model.id) 
    
1

如果你想使用一個變量的方法,那麼我認爲send是路要走。

按照document

send(symbol [, args...]) → obj 
send(string [, args...]) → obj 

調用由符號/字符串識別的方法,傳遞指定的任何參數。如果名稱發送與obj中的現有方法衝突,則可以使用__send__。當方法由字符串標識時,字符串將轉換爲符號。

+0

我想你可能是對的 – superluminary 2013-03-01 12:37:02

1

嘗試如下,簡單的2線

options = { :"star[model]" => model.class, :"star[model_id]" => model.id } 

href = star ? star_path(options) : unstar_path(options) 
+1

在這種情況下使用三元運算符會不會更好?像'href = star? star_path(options):unstar_path(options)' – 2013-02-28 13:08:13

+0

同意是的,謝謝 – 2013-02-28 13:09:28

2

怎麼樣toggle_star_path幫手

def toggle_star_path star, model 
    options = { :"star[model]" => model.class, :"star[model_id]" => model.id } 
    star ? unstar_path(options) : star_path(options) 
end 

那麼在你看來,你只要致電:

toggle_star_path star, model 
0

與此發佈的其他解決方案的合作,我看中了這個:

options = {:"star[model]" => model.class, :"star[model_id]" => model.id} 
href = send((star ? :unstar_path : :star_path), options) 
相關問題