【问题标题】:How to respond to a fetch(post) with js.erb?如何使用 js.erb 响应 fetch(post)?
【发布时间】:2020-04-10 15:17:01
【问题描述】:

我正在尝试发出一个帖子请求,该请求将获取所有事件(Jams)并通过 ajax 动态更新页面。所以我的控制器接收 JSON 格式的参数,我想用 js 来响应,就像你对 remote: true 在链接或按钮上所做的那样。

我正在使用 rails 6.0.2.2

这是在我的 .js 文件中 =>

const getJams = () => {
  const mapCenter = map.getCenter();
  const mapBounds = map.getBounds();
  const token = document.getElementsByName("csrf-token")[0].content
  fetch(window.location.origin + "/search", {
    method: "POST",
    headers: {
      'Accept': "text/javascript",
      'Content-Type': "application/javascript",
      'X-CSRF-Token': token
    },
    body: JSON.stringify({
      map_center: mapCenter,
      max_lat: mapBounds._ne.lat,
      min_lat: mapBounds._sw.lat,
      max_lng: mapBounds._ne.lng,
      min_lng: mapBounds._sw.lng
    }),
    credentials: "same-origin"
  })
}

发送数据的搜索控制器中的方法是这样的 =>

def index
    @jams = policy_scope(Jam)

    respond_to do |f|
      f.json do |f|
        render json: {
          jams: render_to_string(
            partial: 'jams/jams',
            formats: :html,
            layout: false,
            locals: { jams: @jams }
          )
        }
      end
    end
  end

像这样执行,在我的 byebug 中存在参数,所以这似乎是正确的。如果我继续,我的服务器会显示这个

Completed 406 Not Acceptable in 1ms (ActiveRecord: 0.0ms | Allocations: 889)



ActionController::UnknownFormat (ActionController::UnknownFormat):

app/controllers/searchs_controller.rb:7:in `index'

我想在那个 search.js.erb 文件中工作以将元素附加到我的视图中。虽然,我的 search.js.erb 仅包含 console.log("a"); 但该 js 似乎没有被执行。控制台中不显示任何内容。

如果有人可以帮助我,我将不胜感激。

这里是果酱的内部/_jam.html.erb partial =>

<% jams.each do |jam| %>
<div class="jam-card">
  <%= image_tag jam.photo %>
  <%= jam.status %>
  <%= jam.user.first_name %>
  <%= jam.music_style.music_style %>
  <%= display_date(jam.start_date_time, jam.duration) %>
  <%= jam.participants.count %>/<%= jam.max_participants %>
</div>
<% end %>

【问题讨论】:

    标签: javascript ruby-on-rails ajax fetch ruby-on-rails-6


    【解决方案1】:

    提示。你不需要js.erb 模板。

    • 他们把流程弄得一团糟。当您使用js.erb 模板时,您现在可以在每一行的 Ruby 和 JavaScript 以及服务器端和客户端之间进行上下文切换。这种心理体操不会促进高质量的代码。
    • js.erb 模板不由资产管道/webpacker 提供,因此不被 CDN 压缩或提供。
    • 你知道你精心制作的那个安静的服务器端应用吗?吻别它,因为它现在负责客户端转换,并充满了摆动路线和意大利面条代码 javascript 视图。

    要么使用 JSON 对象数组响应请求,让客户端处理模板,要么在 JSON 响应中传回 HTML 字符串,让真正的 ajax 处理程序真正完成其工作:

    def index
      @jams = policy_scope(Jam)
      respond_to do |f|
        f.json do 
          render json: { 
            jams: render_to_string(
              partial: 'jams/jams', 
              formats: :html, 
              layout: false, 
              locals: { jams: @jams}
            )
         }
        end
      end
    end
    

    .then(function(response) {
      document.getElementById("some_element").innerHTML = response;
    })
    

    还有一些方法,人们使用request.xhr 发送回 HTML 块以响应 HTML ajax 请求或使用自定义内容类型。都比js.erb好。

    【讨论】:

    • 我已经编辑了帖子以使用您的方法显示更新的文件。谢谢,它给了我一些继续的方法!
    • 如果您查看日志,第一行应该是“处理为 ”之类的内容。它在寻找什么格式?
    • SearchsController#index 作为 JS 处理它现在作为 JS 处理,所以在获取请求中我应该再次将其更改为 json?
    • 啊,当然——你发送的是Accept: "text/javascript"。只需将您的 ajax 调用中的接受和内容类型更改为 "application/json"。不过,您只需要真正的内容类型。另一个是隐含的。
    • 天哪!有用 !太棒了,你救了我!再见 js.erb 的。我刚开始编码,他们说总是使用 remote: true 和 js.erb。我不知道我们可以在渲染 json 中调用部分内容:!非常感谢!
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多