Ruby on Rails で、ヘルパーinnerHTML
を使用して div タグのを更新しようとしています。form_remote_tag
この更新は、関連する選択タグが onchange イベントを受け取るたびに発生します。問題は、<select onchange="this.form.submit();">
; 動作しません。もありませんdocument.forms[0].submit()
。form_remote_tag で生成された onsubmit コードを実行する唯一の方法は、非表示の送信ボタンを作成し、select タグからボタンのクリック メソッドを呼び出すことです。これは、動作する ERb の部分的な例です。
<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%>
<% content_tag :div, :id => 'content' do -%>
<%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.commit.click" %>
<%= submit_tag 'submit_button', :style => "display: none" %>
<% end %>
<% end %>
私がやりたいのはこのようなことですが、うまくいきません。
<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%>
<% content_tag :div, :id => 'content' do -%>
# the following line does not work
<%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.onsubmit()" %>
<% end %>
<% end %>
では、このユースケースで非表示の送信ボタンを削除する方法はありますか?
若干の混乱があるようです。それでは、説明させてください。基本的な問題は、フォームにレンダリングされsubmit()
たコードを呼び出さないことです。onsubmit()
この ERb から Rails がレンダリングする実際の HTML フォームは次のようになります。
<form action="/products/1" method="post" onsubmit="new Ajax.Updater('content', '/products/1', {asynchronous:true, evalScripts:true, method:'get', parameters:Form.serialize(this)}); return false;">
<div style="margin:0;padding:0">
<input name="authenticity_token" type="hidden" value="4eacf78eb87e9262a0b631a8a6e417e9a5957cab" />
</div>
<div id="content">
<select id="update" name="update" onchange="this.form.commit.click">
<option value="1">foo</option>
<option value="2">bar</option>
</select>
<input name="commit" style="display: none" type="submit" value="submit_button" />
</div>
</form>
目に見えない送信ボタンを削除したいのですが、まっすぐな form.submit を使用するとうまくいかないようです。そのため、フォームの onsubmit イベント コードを呼び出す何らかの方法が必要です。
return(false);
更新: Rails によって生成された がなければ、Orion Edwards ソリューションは機能します。目に見えない送信ボタンにファントム クリックを送信するかgetAttribute('onsubmit')
、javascript 文字列置換でリターン コールを削除した後に呼び出しで eval を呼び出すか、どちらが悪いかはわかりません。