"Render: ništa => true" повертає порожній файл простого тексту?


116

Я на Rails 2.3.3, і мені потрібно зробити посилання, яке надсилає запит на пошту.

У мене є такий, який виглядає так:

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

Що робить відповідну поведінку JavaScript за посиланням:

<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>'

Моя дія контролера працює, і налаштовано нічого не робити:

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

Але коли я натискаю посилання, мій браузер завантажує порожній текстовий файл під назвою "resend_confirm_email".

Що дає?


Для рейок 5, ви можете переглянути цей відповідь stackoverflow.com/a/34688727/1770571
Сальма Гома

Відповіді:


146

ОНОВЛЕННЯ: Це стара відповідь на застарілі версії Rails. Про Рейки 4+ див. Допису Вільяма Денніса нижче.

Мені здається, що тип вмісту відповіді невірний або неправильно інтерпретований у вашому браузері. Двічі перевірте заголовки http, щоб побачити, який тип вмісту відповідає.

Якщо це щось інше text/html, ви можете спробувати вручну встановити такий тип вмісту:

render :nothing => true, :status => 200, :content_type => 'text/html'

258

Оскільки Rails 4, headтепер віддається перевага render :nothing. 1

head :ok, content_type: "text/html"

# or (equivalent)

head 200, content_type: "text/html"

є кращим

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

# or (equivalent)

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

Технічно вони однакові. Якщо ви подивитесь на відповідь або на використання курсу CURL, ви побачите:

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

Однак виклик headзабезпечує більш очевидну альтернативу дзвінкам, render :nothingоскільки тепер очевидно, що ви генеруєте лише заголовки HTTP.


  1. http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only- responses

Оскільки це також працює в Rails 3, воно також має бути кращим рішенням (але очевидно, що ОП є в додатку Rails 2.3, тому обрана відповідь була відповідна).
Асфанд Казі

2
head 200призводить до 304відповіді для мене (на рейках 4.1.6). На консолі вказано 200 код статусу, але на хромі (мережева панель) 304. render :nothing => trueПідхід працював.
Бастіан Хофманн

2
Чи потрібен тип вмісту, якщо повертається лише заголовок?
Усагі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.