在我的Rails应用程序中,我想在获取调用之后呈现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_to do | format |行我觉得服务器不理解fetch的标题:'Accept':“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不执行)。
你有什么主意吗?非常感谢你的帮助。
有同样的问题,这里实际上有两个问题。你是对的,你的标题不是。这些标题触发.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
希望能帮助到你 :-)