是否可以发送多种格式,例如:
<%= form_for(@post, :format => :json, :csv, :xml) do |f| %>
...
<% end %>
非常感谢你!
是否可以发送多种格式,例如:
<%= form_for(@post, :format => :json, :csv, :xml) do |f| %>
...
<% end %>
非常感谢你!
您不是“发送格式”,而是向服务器发送请求,服务器以指定的格式响应此请求。您可以使用参数告诉控制器您希望它返回哪种格式。
有几种方法可以告诉控制器您想要哪种格式。实际上只有一种方法,传递一个参数,但是有几种方法可以传递这个参数。
我喜欢 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
最近,我遇到了同样的问题,“如何发送所需格式的表单”。
所以我找到了解决方案并对其进行了更改。我只是将操作属性替换为所需的 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
希望它会有用。