"render:nothing = > true" возвращает пустой текстовый файл?


Я на рельсах 2.3.3, и мне нужно сделать ссылку, которая отправляет запрос post.

у меня есть один, который выглядит так:

=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."

что это дает?

2 99

2 ответа:

обновление: это старый ответ для устаревших версий Rails. Для рельсов 4+ см. сообщение Уильяма Денниса ниже.

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

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

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

С Рельсов 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