3

是否可以发送多种格式,例如:

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

非常感谢你!

4

2 回答 2

3

您不是“发送格式”,而是向服务器发送请求,服务器以指定的格式响应此请求。您可以使用参数告诉控制器您希望它返回哪种格式。

有几种方法可以告诉控制器您想要哪种格式。实际上只有一种方法,传递一个参数,但是有几种方法可以传递这个参数。

我喜欢 hidden_​​field 方法,例如,您可以在其中添加一个隐藏字段,其值是您想要的格式,并在用户选择具有该格式的单选按钮时使用 javascript 更改该字段的值。您也可以使用多个提交按钮来执行此操作,并将 HTML onClick 属性设置为更改 hidden_​​field 值的函数。

示例(我将使用多按钮方法,并使用 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

最近,我遇到了同样的问题,“如何发送所需格式的表单”。

所以我找到了解决方案并对其进行了更改。我只是将操作属性替换为所需的 URL,而不是其他参数,因为格式是 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 回答