ROR - 从控制器请求JSON
问题描述:
我有一个通过ajax(使用remotipart gem)上传文件的表单工作正常。我想从服务器作为JSON的响应,并在浏览器上触发一个JavaScript函数。我怎样才能做到这一点?我可以更改表单标签中的设置吗?ROR - 从控制器请求JSON
查看:
<%= form_tag import_companies_path, remote: true do %>
<%= file_field_tag :file %>
<%= submit_tag "Import" %>
<%end%>
位指示:
def import
respond_to do |format|
options = { col_sep: ',', converters: :numeric, headers: true }
array = []
CSV.foreach(params[:file].path, options) do |row|
array.push(row.to_hash)
end
logger.debug "Parsed CSV companies: #{array.inspect}"
format.html { redirect_to companies_path }
format.json{
render json: { items: JSON.pretty_generate(array)}
}
format.js { render js: JSON.pretty_generate(array) }
end
end
答
这可以使用多种技术来完成。
其中之一是如正在使用您的形式,只是增加将接收JSON数据的JavaScript函数:
<script>
function receiverFunction(data) {
console.log(data.name)
}
</script>
<%= form_tag ... %>
...
<% end %>
在你的控制器:
format.js {
@data = { name: 'Dora' }
}
在你import.js.erb
:
receiverFunction(<%= @data.to_json.html_safe %>)
这将转移@data
在json
格式到您网页上的receiverFunction
。
真棒这工作!另一种选择是什么?我想处理ajax成功/错误... – Emon
@Emon其他选项有:(1)使用jQuery发送ajax表单提交; (2)以'json'格式回复而不是'js',但这涉及监听窗体事件('ajax:complete'),实际上它也不适合使用'remote:true'。我会打赌(1)或我的答案中给出的内容。答案是更多的“Railsy”,然后选项(1)。 – dimakura
还有一种方法是从表单视图中删除“receiverFunction”,并在'js'视图中定义它。但在我看来,这太过分了。 – dimakura