有没有一种方法可以在提取调用后呈现js.erb?

时间:2019-04-04 09:28:00

标签: javascript ruby-on-rails fetch erb

在我的Rails应用程序中,我想在fetch调用后呈现js.erb部分,由于某些原因,我不知道它不起作用。如果您能帮助我,那就太好了。

在视图中,事件触发此函数,该函数基本上会执行获取请求:

function updateState(id, state){
      const csrfToken = document.querySelector('meta[name="csrf-token"]').attributes
          .content.value;
      fetch(window.location.origin + "/update_state", {
          method: "POST",
          headers: {
            'Accept': "JS",
            "Content-Type": "application/json",
            "X-CSRF-Token": csrfToken
          },
          body: JSON.stringify({'id': id, 'state': state}),
          credentials: "same-origin"
        })
}

然后在我的控制器中

  def update_state
    @model = Model.find(params[:id])
    authorize @model
    @model.update(state: params[:state])

    respond_to do |format|
      format.html { redirect_to xxx }
      format.js
    end
  end

在我的js.erb文件中:

console.log('hello');

但是,在这种情况下,我从服务器收到错误消息: ActionController :: UnknownFormat 在'respond_do行|格式| 我觉得服务器不理解提取的标题: “接受”:“ JS”

当我查看服务器的日志时:

Started POST "/update_state" for 127.0.0.1 at 2019-04-04 11:22:49 +0200
Processing by ModelsController#update_state as JS

但是我认为Rails无法识别它。我该怎么办?

我也在控制器中尝试过此操作

  def update_state
    @model = Model.find(params[:id])
    authorize @model
    @model.update(state: params[:state])
    render 'update_state.js', layout: false
  end

不触发错误。我在客户端收到了js.erb。但是,它没有执行(console.log不执行)。

你有什么主意吗?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我反过来做。我从未成功使用过js.erb。

因此,我使用带有文本响应的访存调用:

this.myService.searchProducts().subscribe(data=> console.log(data.arr));

然后在控制器/操作中进行

import pathlib

search_path = pathlib.Path.cwd() / "test_folder"
for file in filter(lambda item: item.name != "__init__.py", search_path.rglob("./*.py")):
    print(f"{file}")

那样,它可以工作。希望对您有所帮助。

答案 1 :(得分:0)

有相同的问题,实际上这里有两个问题。您说得对,标题不对。这些触发.js.erb的标头对我有用,似乎很正确:

'dataType': 'json',
'contentType': 'application/json; charset=utf-8',
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-Token': - your CSRF method to get the token -

但接下来要触发js响应的是您的respond_to块:

respond_to do |format|
  format.html { redirect_to xxx }
  format.js
end

必须首先具有format.js。由于rails对HTML做出了响应,它将首先以HTML做出响应,而且似乎甚至没有寻找下一个格式块。

respond_to do |format|
  format.js
  format.html { redirect_to xxx }
end

希望它会有所帮助:-)