私は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+については、以下のWilliam Dennissの投稿を参照してください。
応答のコンテンツタイプが正しくないか、ブラウザで正しく解釈されていないように思えます。 httpヘッダーを再確認して、応答のコンテンツタイプを確認してください。
text/html
以外の場合は、次のようにコンテンツタイプを手動で設定してみてください。
render :nothing => true, :status => 200, :content_type => 'text/html'
Rails 4以降、render :nothing
よりhead
が優先されます。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ヘッダーのみを生成することが明示的になったためです。