2011-09-26 12 views
0

我在其中一個應用中使用了submit_tag表單助手。這個提交按鈕的值應該動態改變。這個提交按鈕的兩個可能值是SaveUpdate。所以,在我看來,我做了如下的事情:params散列提交選項的錯誤值

<% temp = 0 %> 
<% text = '' %> 
<% temp = ActivityLog.find_by_sql("SELECT COUNT(id) AS cnt FROM logs WHERE id > 0")%> 
<% text = temp[0][:count].to_i > 0 ? 'Update' : 'Save' %> 

<!-- other html contents --> 

<%= submit_tag text, :id=>"submitBtn"+i.to_s, :onclick=>"submit_button_clicked(this)"%> 

現在,當我在瀏覽器中運行視圖時,可以看到預期的效果。但軌道控制器接收到params散列中的commit選項的錯誤值。

例如,當text的價值進行評估,以Save,我得到在Firebug的下列內容:

<input type="submit" value="Save" style="" onclick="submit_button_clicked(this)" name="commit" id="submitBtn3"> 
在相關的控制器

raise params.inspect顯示了follwing:

{"commit"=>"Update", 
"authenticity_token"=>"", 
"time"=>{"292"=>"3.0", 
"2"=>"1.0", 
"456"=>"4.0"}, 
"date"=>"2011-09-20"} 

見雖然提交按鈕的值在HTML中顯示爲Save,但軌道控制器將commit的值顯示爲Update。這裏有什麼問題?

回答

0

如果您使用Rails的助手,它提供了一種簡單的方法來選擇按鈕的文字與根據窗體類型:

<%= form_for @activity do |f| %> 
    <%= f.label :title %>: 
    <%= f.text_field :title %><br /> 

    <%= f.submit %> 
<% end %> 

當未給定值時,它會檢查,如果對象是一個新的資源或者不創建適當的標籤。在上面的例子中,如果@activity是一個新記錄,它將使用「創建活動」作爲提交按鈕標籤,否則使用「更新活動」。

P.S.請不要在您的視圖中使用SQL

+0

如果您需要覆蓋默認值,請使用**@activity_log.new_record?**來檢測它是否創建**或**更新** – Anatoly

+0

其實,我是試圖通過Ajax提交表單。所以我使用了'form_remote_tag','submit_tag'是該異步表單的一部分。我需要它是Ajax,所以我不能在這裏使用'form_for'。 (並且我在這裏保留了一些遺留代碼,並且無法真正弄清楚在視圖中不使用SQL的方式......但是我會盡我所能將它移出控制器。) – rstarter

+0

if你需要更新按鈕文本,有2種方法:在一個局部換行按鈕並檢查** new_record?**,第二種方式是使用ajax回調和更新按鈕'在客戶端用回調文本 – Anatoly