次のような複数の形式を送信できますか。
<%= form_for(@post, :format => :json, :csv, :xml) do |f| %>
...
<% end %>
どうもありがとうございました!
次のような複数の形式を送信できますか。
<%= form_for(@post, :format => :json, :csv, :xml) do |f| %>
...
<% end %>
どうもありがとうございました!
「フォーマットを送信する」のではなく、指定されたフォーマットでこのリクエストに応答するサーバーにリクエストを送信します。パラメーターを使用して、コントローラーが返す形式をコントローラーに伝えることができます。
コントローラーに必要な形式を伝える方法はいくつかあります。実際には、パラメーターを渡す方法は 1 つしかありませんが、このパラメーターを渡す方法はいくつかあります。
たとえば、hidden_field メソッドが好きです。このメソッドでは、値が目的の形式の非表示フィールドを追加し、ユーザーがその形式のラジオ ボタンを選択したときに、javascript を使用してこのフィールドの値を変更します。複数の送信ボタンを使用し、hidden_field の値を変更する関数に HTML の onClick 属性を設定して、これを行うこともできます。
例 (マルチボタン メソッドを使用し、jQuery を使用します):
まず、フォームを作成しましょう。
<%= form_for(@post, :format => :json, :csv, :xml) do |f| %>
...
<%= f.hidden_field :random_param_name, :value => "default format value" %>
// Notice you should use f.submit here instead of button_tag, because it's a form_for, not a form_tag
<%= f.submit "Give me XML!", :onClick => "changeFormat('xml');" %>
<%= f.submit "Give me JSON!", :onClick => "changeFormat('json');" %>
<%= f.submit "Give me CSV!", :onClick => "changeFormat('csv');" %>
<% end %>
ここで、changeFormat 関数を追加します。
<script type="text/javascript">
function changeFormat(format) {
// The ID here is in the format "model_name_field_name". This is default for any form_for.
$("#post_random_param_name").val(format);
}
</script>
あとは、コントローラー ( params[:post][:random_param_name]
) でこのパラメーターをキャッチして、必要な処理を実行するだけです。最後に行う必要があるのは、この random_param_name を Post モデルのアクセス可能な属性に追加することです。
attr_accessor :random_param_name
attr_accessible :random_param_name
最近、「希望の形式でフォームを送信する方法」という同じ問題に直面しました。
だから私は解決策を見つけてそれを変更しました。format は URL の一部であるため(フォーム属性ではない) 、追加のパラメーターの代わりに action 属性を必要な URL に置き換えました。
submit_tag "Get JSON", onClick: "$(this).closest('form').attr('action', '#{ my_path(format: :json) }')"
したがって、パラメーターに追いつく必要はありませんrespond_to
。代わりに次を使用します。
respond_to do |format|
format.json { render json: @my_object.to_hash }
format.html
end
それが役に立つことを願っています。