4

ユーザーログインにDevisewithRailsを使用しています。それはすべてうまく機能しますが、特定のリダイレクトを機能させることができません。

私はレールに慣れていないので、私が物事をしている方法は正しくないかもしれません。

基本的に、例を挙げれば、ユーザーが投稿を高く評価できるようにしています。ただし、そのためにはサインインする必要があります。コントローラーに「like」というアクションを作成しましたが、コントローラーにはデバイスフィルターがあります

before_filter :authenticate_user!, :except => [:index, :show]

入力すると、サインインページが表示されます。ユーザーがサインインしたら、「like」アクションが呼び出されて気に入った投稿にリダイレクトしたいと思います。

私のコントローラーは次のようになります

def like

  @post = Post.find(params[:id]) 
  @like = Like.new;
  @like.user_id = current_user.id;
  @like.post_id = params[:id];
  respond_to do |format|
    if @like.save
      format.html { redirect_to @post, notice: 'You have like this post' }
      format.json { head :no_content }
    else 
      format.html { redirect_to @post, notice: 'Sorry you like was not saved  } 
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end  
end 

当然、after_sign_in_path_forを使用してパスをハードコーディングすることはできません

def after_sign_in_path_for(resource)    
  #path to somewhere
end

しかし、私はセッション変数を使用でき、おそらく上記のコードでそれを呼び出すことができることを読みました。Railsのどの部分にセッション変数を書き込むことができますか?コントローラーアクションでは遅すぎるため(デバイスが同様のアクションにヒットする前に引き継ぐため)、ビューで設定する方法がわかりません。

また、私のリンクは次のようになります

<%= link_to "Like", {:controller => :posts, :action => :like, :id => @post.id}, {:method => :post } %> |

PS新しい「投稿」の作成を使用する場合のリダイレクトは正常に機能します。つまり、ユーザーはサインインして新しい投稿ビューにリダイレクトされます。

ヘルプとヒントをいただければ幸いです。

ありがとう

4

2 に答える 2

3

同様のアクションがPOST用に特別に設計されているため、これが発生しています。したがって、そのURLにPOSTする前に、ユーザーがサインインしていることを確認する必要があります。セッションでそれを行うには注意が必要です。

  • あなたはそれをから除外することによって同様の方法の保護を解除する必要がありますbefore_filter
  • user_signed_in?次に、 (これがヘルパーメソッドであることを忘れないでください)かどうかを手動で確認します。
  • 次に(ユーザーがサインインしていない場合)、セッションで好きなものを隠し、リターンURLを使用してサインインページにリダイレクトします
  • ユーザーがこのリターンURLにアクセスすると(POSTではなくGETになります)、セッション情報を検索して、元のLikeが実行するはずだったことを実行する必要があります(ただし、それまでにユーザーはサインインします)。

このダンスはすべてGETリクエストで終了するので、そもそもGETリクエストでLikeアクションを機能させ、クエリ文字列でパラメータを渡してみませんか?Likeはbefore_filterによって保護されているため、コードを0回変更する必要があり、セキュリティの脅威にさらされることはありません。タグにrel="nofollow"を使用して、いいねリンクの後に検索エンジンが続かないようにする必要があり<a>ます。

関連する議論については、railsでPOSTを使用するredirect_toを参照してください。そこでの提案の1つは、JavaScriptを介してクライアント上でフォームを作成して送信することです。これは、ユーザーが認証されると、その戻りURLビューで発生する必要があります。同様のアクションをGETとして公開することに反対する場合(これはRESTの原則に違反します)、これが最善の妥協案となる可能性があります。

于 2012-11-22T03:17:17.517 に答える
0

これは簡単に修正できます。

アプリケーションコントローラーに移動します。

 # after login redirect
 after_filter :store_location

 def store_location
   # previous url save when its not a admin or user url
   session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/ || request.fullpath =~ /\/admin/ || request.fullpath =~ /\/admin\/login/ || 
   request.fullpath =~ /\/login/
 end
于 2013-10-08T13:33:36.600 に答える