2013-08-02 43 views
0

RoR newbee的位。我想在表單上顯示模型屬性,爲用戶提供更改其值並「提交」表單的功能。我想將表單路由到一個控制器,該控制器不屬於該屬性所屬類的「基本」控制器,並且具有「輔助」控制器更新數據庫中的屬性。下面是窗體的代碼:如何將表單路由到與模型類關聯的控制器以外的控制器?

<h1>Edit Number of Current Calls</h1> 
<%= form_for(@client) do |f| %> 
    <% if @client.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@client.errors.count, "error") %> 
     prohibited this client from being saved:</h2> 
     <ul> 
     <% @client.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label "Number of Current Calls:" %><br /> 
    <%= f.text_field :current_call_count %> 
    </div> 
    <%= button_to 'Update In', { :controller => "client_profiles", :action => "update" }, :method => :put %> 
<% end %> 

<%= button_to 'Update Out 1', { :controller => "client_profiles", :action => "update" }, :method => :put %> 

<%= button_to 'Update Out 2', { :controller => "client_profiles", :action => "update", :client => {:current_call_count => @client.current_call_count} }, :method => :put %> 

如果用戶「點擊」的「更新在」按鈕其提交被路由到「客戶」控制器和屬性在DB更新。

如果用戶點擊任一「更新輸出1」或「更新輸出2」按鈕其提交被路由到「client_profiles」的控制器,但該屬性不被更新。下面是相關的代碼在「client_profiles」控制器:

def update 
     @client = Client.find(params[:id]) 
     @client.update_attributes(params[:client]) 
     redirect_to show_phone_client_profile_path(@client) 
    end 

我怎樣才能航線「更新在」提交「client_profiles」控制器?

如何捕獲的「更新Out」按鈕輸入值的用戶?

爲什麼出現「button_to代碼」的位置改變是針對在button_to選擇路由?

我真的要更新只是從幾個模型顯示的數據形式的一個屬性。什麼是正確的Rails方式?

+0

這裏有很多事情要做,還有幾件事情需要改變。也許你可以用1或2句話來描述你想要的功能? – tyler

回答

0

如果您認爲有多種型號,並要更新特定的模式,那麼你可以通過特定的模型或可能只是ID,並通過URL params中的散列改變屬性。但它主要取決於你想要達到的目標。也許你應該改寫你確切的問題來說清楚。

0

好了,這已經超過一件事怎麼回事,首先讓我們來看看比較簡單的一個問題:

爲什麼會出現「button_to代碼」的位置改變所指向的路由在button_to選項?

這很簡單:這是因爲Update In按鈕位於您的表單塊內。因此,只需將表單提交到form_for區塊第一行中指定的操作即可。

在這裏認識的第一件事是,表單的提交的作用是不依賴於提交按鈕,它是依賴於形式本身的屬性。如果您檢查呈現的HTML,則會看到<form>元素具有一個名爲action的屬性。當點擊表單內的提交按鈕時,它會將表單數據提交到該操作中指定的位置。在這種情況下,action屬性源自form_for塊的傳入對象(@client)使用Rails假定的資源路由,因爲convention-before-configuration。

如果希望能夠提交表單到多個位置,我會使用jQuery和AJAX崗位。

基本上發生的事情是,您的Update Out按鈕沒有附加到表單,所以他們沒有提交表單的數據。你需要以某種方式將這兩者聯繫起來,並且由於表單本身確實只支持一個提交函數,所以你基本上必須用JavaScript來完成。

我不會試圖記錄jQuery API,但您基本上想要在這裏執行的操作是爲每個按鈕註冊一個jQuery POST回調,以便將表單數據提交到相關頁面。

+0

感謝您對錶單提交公約的深入瞭解。您將我引向了一種解決方案,該解決方案將表單提交到控制器所在的位置之後,將邏輯放在一起! – user2645691