2013-04-07 43 views
2

RoR的新手。我無法理解如何在我的視圖中調用我的表單控制器上的簡單方法的概念。我想從視圖中收集2條信息,在表單控制器上調用一個方法,根據參數檢索一條信息,然後在同一個視圖或另一個視圖上顯示該條信息。現在,我試圖使用表單控制器實例變量來完成新信息的顯示 - 不確定如何刷新視圖來顯示它,但這是未來的障礙。現在,我可以單擊我的提交按鈕而不會出現任何錯誤,但顯然不符合我的表單控制器方法。 下面是我的看法ERB文件:如何從Rails中的視圖調用窗體控制器上的方法?

<h1>Enter Required Information</h1> 

<%= form_tag (get_hotel_recommendation_path) do %> 
    <%= label_tag(:name, "Name:") %> 
    <%= text_field_tag(:name) %> 
    <%= label_tag(:date, "Date (yyyy-mm-dd):") %> 
    <%= text_field_tag(:date) %> 
    <%= submit_tag("Submit") %><br><br> 
    <%= label_tag(:recommendation, "Recommendation:") %> 
    <%= @recommended_hotel_name %> 
<% end %> 

這裏是我的表單控件代碼:

class RecommendHotelController < ApplicationController 

    @recommended_hotel_name = '' 

    def collect_info 

    end 

    def get_hotel_recommendation 
    @recommended_hotel_name = Member.recommended_hotel_name(params[:name], params[:date]) 
    end 

end 

我真的只是想一個簡單易用的方式來做到這一點 - 不一定是最好的。我只需要一個快速的用戶界面來演示我的模型代碼。我需要儘快完成。

新形式的控制器代碼:

class RecommendHotelController < ApplicationController 

    def collect_info 
    end 

    def get_hotel_recommendation 
    redirect_to recommend_hotel_path 
    end 

    protected 

    helper_method :recommended_hotel_name 
    def recommended_hotel_name 
     unless (params[:name].nil?) 
     Member.recommended_hotel_name(params[:name], params[:date]) 
     end 
    end 

end 
+0

日誌文件是什麼?這將顯示它是否正在觸發控制器操作。你發佈的觀點是哪一種行動? – 2013-04-07 08:22:17

+0

當診斷出這樣的問題時,一定要注意'log/development.log',看看它會發生什麼。大多數Rails開發者都習慣在開發過程中觀看這個文件,比如'tail -f log/development.log',如果你能這樣做的話。 – tadman 2013-04-07 08:31:32

+0

弗雷德裏克,我沒有看到日誌文件中與控制器相關的任何內容。當您詢問視圖張貼的是哪個動作時,您是指put/post/get區分嗎?如果是這樣,當我不處理顯示,更新或添加模型對象時,我對這些概念並沒有牢固的把握。我只想收集2個字符串並吐出另一個字符串。似乎應該有一個簡單的方法來做到這一點。 – Sedona 2013-04-08 04:22:40

回答

0

你可以得到所有從一種形式的信息的params數組中提交。但是,從你的例子中,我會建議使用:form_for,而不是使用單獨的form_tags。

+0

感謝您的回答。我曾經認爲form_for僅僅是用於處理模型對象的時候,但正如我所說的,我對此非常陌生,尤其是UI部分。 – Sedona 2013-04-08 04:25:10

+0

它可以做很多事情,如果沒有幫助,你總是可以回到'fields_for' – 2013-04-08 08:19:36

2

一旦控制器切換到視圖,就不會返回調用其他方法。控制器的工作是預先準備好所有可能需要的視圖。一旦進入render階段,就無法調用控制器方法。

的例外是輔助方法,其可以被調用。你需要明確地聲明你想要在視圖中使用的任何方法。舉個例子:

helper_method :get_hotel_recommendation 
def get_hotel_recommendation 
    # ... 
end 

的輔助方法,也可以位於相關的輔助模塊內,這是一個好主意,把它們放在那裏,如果他們使用專門視圖中。

在你的情況,如果你使用這個只有一次,你應該跳過分配到一個實例變量,只是返回對象的問題。該視圖將如下所示:

<%= recommended_hotel_name %> 

的調整控制方法:

class RecommendHotelController < ApplicationController 
protected 
    helper_method :recommended_hotel_name 
    def recommended_hotel_name 
    Member.recommended_hotel_name(params[:name], params[:date]) 
    end 
end 

值得一提的是,在班級範圍內聲明@recommended_hotel_name = ''可能不是你想要什麼。這會創建一個類變量,而不是一個實例變量。控制器中的實例變量必須在主要操作方法內或在方法內部定義。還要記住默認情況下實例變量爲nil,所以不需要先初始化它們。一個空字符串和nil在視圖中使用時是等效的,<%= ... %>中的所有內容都會自動轉換爲字符串。

另一件需要注意的是留下方法名和它的參數之間的空間。它應該是form_tag(...)而不是form_tag (...)。通常情況下,這並沒有什麼區別,Ruby可以非常寬鬆,但有時它可以巧妙地改變參數的解釋方式,從而在您嘗試診斷問題時導致很多混淆。在風格上,只有像if,whilecase這樣的關鍵字在括號前有空格,因爲這些不是方法調用。

至於爲什麼你的表格不工作,目前還不清楚。這些參數應該按照您的意願提交,但可能您沒有獲得正確的路由。請記住,最好堅持使用標準indexnewshowedit的名稱,除非您正在做一些異國情調。在這種情況下,如果它顯示多條記錄,您應該將其定義爲index;如果它總是一條記錄,則應該將其定義爲show

+0

非常感謝你的詳細答案!我沒有顯示記錄。我只想收集來自用戶的兩條信息:姓名和日期。然後使用這些參數來檢索顯示在視圖上的字符串。我會嘗試一些你的建議,看看我能不能讓它變成一種工作 – Sedona 2013-04-08 04:07:53

+0

對於你推薦用於視圖的「<%= recommended_hotel_name%>」部分,直到用戶提交了名字之後,我纔會推薦它和日期,那麼這將如何觸發更新? – Sedona 2013-04-08 04:28:42

+0

原來,這是我的路由語法錯誤,阻止正確的表單控制器方法被調用。哈利路亞!現在我可以處理下一百萬個錯誤! ; > – Sedona 2013-04-08 05:28:31

相關問題