2012-10-28 57 views
0

我試圖最好地理解如何將軌道幫助程序與haml視圖一起使用。RoR:將代碼從視圖移至幫助程序

我最初包含這個邏輯

= fund_levels_last(i, @fund_level_count) ? (link_to "add new level", ad, {class: 'button orange sm'}) : (link_to "remove", accounts_ad_fund_level_path(ad, fl.object.id), {:class => 'button orange sm', :method => :delete, :remote => true, :confirm => t('q.are_you_sure')}) 

希望保持視圖乾淨的代碼可能一個觀點,我一直在嘗試這樣的邏輯移到幫手。

def fund_levels_last(i, flcount) 
    if i == flcount 
     true 
    else 
     false 
    end 
    end 

    def fund_levels_btn(i, flcount) 
    if self.fund_levels_last(i, flcount) 
     link_to "add new level", ad, {class: 'button orange sm'} 
    else 
     link_to "remove", accounts_ad_fund_level_path(ad, fl.object.id), {:class => 'button orange sm', :method => :delete, :remote => true, :confirm => t('q.are_you_sure')} 
    end 
    end 

但是,在助手中,我無法訪問視圖中的變量和對象(ad,object,fl等)。我認爲我可以將所有這些傳遞給輔助方法,但不知何故,這似乎太複雜了,我有這種感覺,我在這裏走錯了路。我在視圖中的單行代碼似乎最終成爲助手中的15行代碼...

將此邏輯從視圖移動到助手的最簡單方法是什麼?

+0

你可以看看https://github.com/drapergem/draper, – pjam

回答

2

如果你的代碼很簡單,你可能真的需要一個部分。然後你就可以通過代碼/變量,就像這樣:

<%= render :partial => 'funds/partial_view', :locals => { :var => variable } %>

但如果你需要一個幫手,你將不得不作爲參數傳遞:

def funds_helper(var) //do something interesting end

然而,沒有任何理由採取一切你的邏輯出的觀點,而不是分解成諧音:

在控制器

@fund_level = fund_levels_last(i, @fund_level_count)

鑑於: <%= @fund_level ? render :partial => 'funds/add_new_level' : render :partial => 'funds/remove_level' %>

然後讓你的局部視圖有正確的看法。

+0

謝謝!決定將其作爲一個部分來完成,通過渲染「fund_level_form」,f:f,ad:ad來調用它。似乎工作出色:) – charliez

3

順便說一句,該方法

def fund_levels_last(i, flcount) 
    if i == flcount 
    true 
    else 
    false 
    end 
end 

可能僅僅是:

def fund_levels_last(i, flcount) 
    i == flcount 
end 

而且,對返回boolean經常與?結尾方法,所以它會成爲def fund_levels_last?(i, flcount)

+0

謝謝!顯然這是一個更優雅和高效的代碼! 但是,將視圖的邏輯移至助手的原始問題仍然存在。我試圖保持link_to在視圖中,只是從助手返回link_to數據,但這似乎並沒有工作... – charliez