Я на 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".
Что дает?
ОБНОВЛЕНИЕ: Это старый ответ для старых версий Rails. Для Rails 4+, см. Пост Уильяма Денниса ниже.
Мне кажется, что тип содержимого ответа неверен или неправильно интерпретирован в вашем браузере. Дважды проверьте ваши заголовки http, чтобы увидеть, какой тип содержимого является ответом.
Если это что-то отличное от text/html
, вы можете попробовать вручную установить тип контента следующим образом:
render :nothing => true, :status => 200, :content_type => 'text/html'
Так как 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-заголовки.