[英]Clarity on response formats and page reload for html response in Rails
我想了解 Rails 中的響應format
操作。 假設我的部分中有一個link_to
,它在show
頁面中呈現如下:
顯示.html.erb
<%= render partial: 'my_partial', locals: { stage: @stage } %>
my_partial.html.erb
<% case 'stage' %>
<% when 'beginning' %>
<%= link_to 'Submit', { controller: 'my_controller', action: 'update_model' } %>
<% when 'ongoing' %>
<%= render partial: 'another_partial' %>
<% end %>
my_controller.rb
def update_model
#do something
respond_to do |format|
format.json { render json: { some_key: some_value } }
format.js { render partial: 'path_to_partial/partial.js' }
format.html { redirect_to action: 'show' }
end
end
在這里,每當第一次加載show
頁面時, @stage
將beginning
,然后單擊link_to 'Submit'
然后在來自控制器的響應之前@stage
將更改為ongoing
。
現在每當我點擊link_to
,頁面都會重新加載並且response
是html
因此format.html
被發送。 如果我添加remote: true
則響應在js
並且頁面不會重新加載,因為它是remote
。
所以我想要的確切功能是重新呈現show
頁面,然后在my_partial
內部它應該when ongoing
轉到,然后在不重新加載的情況下呈現another_partial
頁面。 這發生在同一個網址中。
我想了解的是為什么頁面在相同的 url 時會重新加載? format.html
就是這樣工作的嗎? 我應該怎么做才能再次呈現show
頁面但不重新加載頁面?
respond_to do |format|
它是否查看傳入的 http 請求期望的響應。 通常,如果您單擊鏈接或提交表單,它需要 html。 但是,正如您所說的那樣,如果您添加remote: true
,則鏈接發出的 http 請求需要 javascript。 現在您只想重新呈現部分頁面,而不是整個頁面。 你可以在控制器中這樣做
def update_model
...
respond_to do |format|
...
format.js
...
end
end
不要給format.js
一個塊,這將自動在視圖中渲染一個文件 - 像往常一樣 - 應該像控制器動作一樣命名。 所以update_model.js.erb
在這里你可以決定做什么。 因此,例如找到包含您的部分的 div,然后重新渲染它。 感謝.erb
你也可以在這個 js 文件中編寫嵌入的 ruby 代碼。 這是您決定要重新渲染的部分或做什么的地方(切換類,...)
const container = document.querySelector("#container-for-partial")
const partial = "<%= j render 'some_partial' %>"
// Inject HTML to partial
container.innerHTML = partial
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.