«Render: nothing => 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».

Что дает?

user225643
источник
Для рельсов 5 вы можете просмотреть этот ответ stackoverflow.com/a/34688727/1770571
Сальма Гомаа

Ответы:

146

ОБНОВЛЕНИЕ: это старый ответ для устаревших версий Rails. Для Rails 4+ см. Сообщение Уильяма Деннисса ниже.

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

Если это что-то иное text/html, вы можете попробовать вручную установить тип контента следующим образом:

render :nothing => true, :status => 200, :content_type => 'text/html'
vonconrad
источник
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, это тоже должно быть предпочтительным решением (но, очевидно, OP находится в приложении Rails 2.3, поэтому выбранный ответ был подходящим).
Асфанд Кази
2
head 200приводит к 304ответу для меня (на рельсах 4.1.6). Консоль показывает код состояния 200, но хром (панель сети) показывает 304. render :nothing => trueПодход сработал.
Bastian Hofmann
2
Необходим ли тип содержимого, если возвращается только заголовок?
Usagi