3

次のような複数の形式を送信できますか。

<%= form_for(@post, :format => :json, :csv, :xml) do |f| %>
  ...
<% end %>

どうもありがとうございました!

4

2 に答える 2

3

「フォーマットを送信する」のではなく、指定されたフォーマットでこのリクエストに応答するサーバーにリクエストを送信します。パラメーターを使用して、コントローラーが返す形式をコントローラーに伝えることができます。

コントローラーに必要な形式を伝える方法はいくつかあります。実際には、パラメーターを渡す方法は 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
于 2012-11-19T12:35:30.600 に答える
2

最近、「希望の形式でフォームを送信する方法」という同じ問題に直面しました。

だから私は解決策を見つけてそれを変更しました。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

それが役に立つことを願っています。

于 2015-06-03T09:34:52.410 に答える