【问题标题】:ROR - Requesting JSON from ControllerROR - 从控制器请求 JSON
【发布时间】:2015-09-24 15:50:53
【问题描述】:

我有一个通过 ajax(使用 remotipart gem)上传文件的表单,它工作正常。我希望来自服务器的响应为 JSON 并在浏览器上触发一个 javascript 函数。我怎样才能做到这一点?我可以更改表单标签中的设置吗?

查看:

<%= 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

【问题讨论】:

    标签: ruby-on-rails json


    【解决方案1】:

    这可以使用多种技术来完成。

    其中之一是按原样使用您的表单,只需添加一个将接收 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 %>)
    

    这会将json 格式的@data 传输到您页面上的receiverFunction

    【讨论】:

    • 太棒了!另一种选择是什么?我想处理 ajax 成功/错误...
    • @Emon 其他选项有: (1) 在表单提交时使用 jquery 发送 ajax; (2)回复json格式而不是js,但这涉及到监听表单事件(ajax:complete),实际上remote: true也不是正确使用。我会打赌(1)或我的答案中给出的内容。答案比选项 (1) 更“Railsy”。
    • 另一种方法是从表单视图中删除receiverFunction 并在js 视图中定义它。但在我看来,这太牵强了。
    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2018-01-25
    • 2021-05-17
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多