簡體   English   中英

在 Rails 中明確響應格式和頁面重新加載 html 響應

[英]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頁面時, @stagebeginning ,然后單擊link_to 'Submit'然后在來自控制器的響應之前@stage將更改為ongoing

現在每當我點擊link_to ,頁面都會重新加載並且responsehtml因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM