2010-07-20 16 views
1

比方說,我有了methodA如何調用方法並在RoR中發送新參數?

def methodA 
    note = Note.find(params[:id]) 
    note.link = params[:link] 
    note.linktype = params[:linktype] 
    note.save 
    redirect_to(notes_url) 
    end 

當我打電話從這樣的觀點這種方法,它工作正常

<%= link_to image_tag(w.link, :border =>0), methodA_path(:linktype => w.linktype, :link => w.link, :id => @note.id) %> 

但是,如果我從另一個調用方法的方法,就像同一個控制器這樣的:

def methodB 
    ... 
    methodA(:id => params[:id], :link => link, :linktype => "image") 
end 

我得到這個錯誤:

wrong number of arguments (1 for 0) 

methodA得到的參數仍然是methodB得到的參數,而不是我從methodB發送的參數。我如何解決這個問題?感謝閱讀。

+0

什麼是addMedia? – Salil 2010-07-20 05:04:46

回答

4

幾件事情:

  • 的Ruby和on Rails的,因此紅寶石,命名慣例是使用下劃線符號而不是camelcase。所以它應該是method_a而不是methodA
  • 它看起來像methodA是一個控制器操作。如果你看看你的方法簽名,你實際上並沒有定義任何方法參數。這是一件好事:行動不採取任何行動。
  • params呼叫在methodA動作不訪問方法的參數,但是訪問Rails的要求params hash.
  • 在你看來,你沒有實際調用的方法。相反,您要鏈接到該操作,點擊該操作時,會啓動一個發送到該操作的請求。您調用的實際方法是生成URL的methodA_path。這是url_for的快捷方式,它會自動爲您填入一些參數(其他參數在您傳遞的哈希中)。這個方法是從你的路由中爲你自動生成的。從您的應用的根目錄下執行rake routes以獲取更多信息。
  • 如果您想從methodB調用操作方法,這可能不明智,您不需要將參數傳遞給它。由於methodB也是在其自己的請求週期中調用的動作,params散列仍可用於methodA,它會發現所有這些事情都很好。然而,我建議將任何常見的功能提取到第三個輔助方法中,並從每個操作中調用它;從其他行爲中調用行爲對我來說就像是一種代碼味道。

摘要的位:methodAmethodA_path不同方法。前者不接受任何參數,但訪問Rails請求參數散列,而後者將參數傳遞給url_for

這是非常基本的,所以我強烈建議你閱讀Agile Web Development with Rails(Rails 2的第3版,Rails 3的第4版)。

+0

感謝你,我會檢查出這本書。快速的問題,當你說「提取任何常見功能到第三個幫助器方法並從每個操作調用它」時,我應該把第三個方法放在同一個控制器中,還是實際上放在控制器的幫助器文件中? – ben 2010-07-20 05:20:33

+0

粗略地說,從控制器調用的輔助方法應該在控制器中。幫助程序文件適用於從視圖中調用的方法。 – 2010-07-20 07:00:10

0

我想通過addMedia你的意思了methodA

注意,方法methodA_path是不一樣的methodA。第一個是自動生成的,因爲您有一條名爲methodA的路線,並返回訪問該路線所需的url。因此,它返回字符串。而methodA通常呈現html模板。

如果要委託渲染到另一個動作,你可以做這樣的事情:redirect_to :action => :methodA, :id => 1, :otherParam => 2

+0

重定向與調用方法並不相同,如果路由配置爲需要POST(它應該是,因爲'methodA'不是冪等的),那麼它也不會有相同的效果。不是我建議從行動中調用行爲,就像我在答案中提到的那樣。 – 2010-07-20 05:07:12

+0

@Ian _不是我建議從actions_中調用動作_而且我也認爲這不是他想要的:)我們只能猜測 – 2010-07-20 05:11:37

2

致電method_a_pathmethod_a是不一樣的。

  • method_a不帶參數。它在動作調用期間將參數從params哈希集訪問到控制器實例。

  • method_a_path不調用method_a,它只是生成調用方法的URL。實際的調用發生在用戶點擊鏈接並且rails服務器處理請求時。

如果你想重用在不同勢背景的方法提取的行動,新的方法的代碼如下所示:

class PostsController < ApplicationController 
    def add_media 
    add_media_with_para(params) 
    end 

    def action2 
    add_media_with_para(:id => params[:id], :link => link, :linktype => "image") 
    end 
private 

    def add_media_with_para p = {} 
    note = Note.find(p[:id]) 
    note.link = p[:link] 
    note.linktype = p[:linktype] 
    note.save 
    redirect_to(notes_url)  
    end 
end 

現在,在你看來,你可以得到路徑add_media動作如下:

posts_add_media_path(:linktype => w.linktype, :link => w.link, :id => @note.id) 
+0

謝謝你,這真的幫助/ – ben 2010-07-20 08:50:29

相關問題