„Render: none => true” zwraca pusty plik tekstowy?

116

Jestem na Railsach 2.3.3 i muszę utworzyć łącze, które wysyła żądanie postu.

Mam taki, który wygląda tak:

= link_to('Resend Email', 
  {:controller => 'account', :action => 'resend_confirm_email'}, 
  {:method => :post} )

Co sprawia, że ​​łącze JavaScript działa prawidłowo:

<a href="/account/resend_confirm_email" 
  onclick="var f = document.createElement('form'); 
  f.style.display = 'none'; 
  this.parentNode.appendChild(f); 
  f.method = 'POST'; 
  f.action = this.href;
  var s = document.createElement('input'); 
  s.setAttribute('type', 'hidden'); 
  s.setAttribute('name', 'authenticity_token'); 
  s.setAttribute('value', 'EL9GYgLL6kdT/eIAzBritmB2OVZEXGRytPv3lcCdGhs=');
  f.appendChild(s);
  f.submit();
  return false;">Resend Email</a>'

Moja akcja kontrolera działa i nic nie jest ustawione:

respond_to do |format|
  format.all { render :nothing => true, :status => 200 }
end

Ale kiedy klikam łącze, moja przeglądarka pobiera pusty plik tekstowy o nazwie „resend_confirm_email”.

Co daje?

user225643
źródło
W przypadku szyn 5 możesz przejrzeć tę odpowiedź stackoverflow.com/a/34688727/1770571
Salma Gomaa,

Odpowiedzi:

146

UPDATE: To jest stara odpowiedź na starsze wersje Railsów. W przypadku Rails 4+, zobacz post Williama Dennissa poniżej.

Wydaje mi się, że typ treści odpowiedzi jest nieprawidłowy lub nieprawidłowo zinterpretowany w Twojej przeglądarce. Dokładnie sprawdź nagłówki http, aby zobaczyć, jakiego typu treści jest odpowiedź.

Jeśli jest to coś innego niż text/html, możesz spróbować ręcznie ustawić typ zawartości w następujący sposób:

render :nothing => true, :status => 200, :content_type => 'text/html'
vonconrad
źródło
258

Od Rails 4 headjest teraz preferowany render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

jest preferowany

render nothing: true, status: :ok, content_type: "text/html"

# or (equivalent)

render nothing: true, status: 200, content_type: "text/html"

Technicznie są takie same. Jeśli spojrzysz na odpowiedź na użycie cURL, zobaczysz:

HTTP/1.1 200 OK
Connection: close
Date: Wed, 1 Oct 2014 05:25:00 GMT
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
X-Runtime: 0.014297
Set-Cookie: _blog_session=...snip...; path=/; HttpOnly
Cache-Control: no-cache

Jednak wywołanie headstanowi bardziej oczywistą alternatywę dla wywołania, render :nothingponieważ jest teraz jawne, że generujesz tylko nagłówki HTTP.


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses
William Denniss
źródło
Ponieważ działa to również w Railsach 3, powinno to być preferowane rozwiązanie również w tym przypadku (ale oczywiście OP jest w aplikacji Rails 2.3, więc wybrana odpowiedź była odpowiednia).
Asfand Qazi
2
head 200daje 304mi odpowiedź (na szynach 4.1.6). Konsola pokazuje kod statusu 200, ale chrome (panel sieciowy) pokazuje 304. render :nothing => truePodejście zadziałało.
Bastian Hofmann
2
Czy typ zawartości jest konieczny, jeśli zwracany jest tylko nagłówek?
Usagi