在我的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不执行)。
你有什么主意吗?非常感谢您的帮助。
答案 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
希望它会有所帮助:-)