2

私のコントローラーでは、 aprojectが実際に特定の に属していることを確認するために、次のようなものをよく使用しuserます。

private

def authorized_user
  @project = Project.find(params[:id])
  redirect_to root_path unless current_user?(@project.user)
end

ユーザー A はユーザー B のプロジェクトを見ることができないため、これはうまく機能します (代わりに、ユーザー B はルート ページに転送されます)。

ただし、これprojectは実際に存在する URL が要求されている場合にのみ機能します。

たとえば、URLhttp://localhost:3000/projects/1はユーザーのプロジェクトを表示するか、ルート URL に転送します (別のユーザーがプロジェクトにアクセスしようとした場合)。

しかし、データベースにまったく存在しないプロジェクトにアクセスしようとすると、たとえば次のようになります。

http://localhost:3000/projects/777

...醜いActiveRecord::RecordNotFoundエラーが発生します:

Couldn't find Person with id=777

ここでのユーザー エクスペリエンスを向上させる最善の方法は何でしょうか?

私はまだ Rails プロジェクトを実際にデプロイしたことがないので、本番モードでこのエラーがどのように表示されるかさえわかりません。

誰でも助けることができますか?

ありがとう...

4

4 に答える 4

5

私は個人的にこれを使用するのが好きです:

@project = Project.where(id: params[:id]).first

プロジェクトが存在しない場合は@projectnil になります。

于 2013-02-14T19:39:58.013 に答える
1

処理方法に応じて、使用できます

@project = Project.find_by_id(params[:id])

これにより、レコードが見つからない場合は @project が nil になり、手動でケースを処理する必要があります。

別の解決策は、リソースが存在しないため意味のある 404 をスローすることです。以下を使用して、任意のコントローラー (またはアプリケーションコントローラー) でこれを簡単に実行できます。

rescue_from ActiveRecord::RecordNotFound, :with => :not_found

def not_found
  raise ActionController::RoutingError.new('Not Found')
end

これは次のような結果になります。

class ApplicationController < ..
  rescue_from ActiveRecord::RecordNotFound, :with => :not_found

  def not_found
    raise ActionController::RoutingError.new('Not Found')
  end
end

後者のソリューションでは、ユーザーにデフォルトの 404(NOT FOUND) エラー ページが表示されます。最初のケースでは、より多くの制御を行うことができますが、どこでもそれを行うという犠牲を払っています

それが役立つことを願っています。

于 2013-02-14T19:44:04.347 に答える
1

試す:

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, :with => :render_404
  # Render 404 page when record not found
    def render_404      
       render :file => "#{RAILS_ROOT}/public/404.html", :status => 404
    end
end
于 2013-02-15T07:21:33.590 に答える
1

まず、許可されていないユーザーがプロジェクトにアクセスするのを防ぐために、find メソッドのスコープを設定する必要があります。

current_user.projects.find(params[:id])

このようにして、開発中に「id のプロジェクトが見つかりませんでした」というエラーが発生します。これを回避するには、次を使用できます。

current_user.projects.find_by_id(params[:id])

例外の代わりに返されますnilが、通常はそうすべきではない正当な理由があります。適切に作成された Rails アプリでは、ユーザーがプロジェクトにアクセスしてはならないのは、URL の ID を手動で変更したときだけです。これを黙ってスキップするのではなく、ログに報告する必要があります。

最後に、404 Not Found の代わりに 403 Forbidden をスローするには、多くの認可ジェム ( cancanRyan Bates によるもの) のいずれかを使用することを検討してください。

編集:ああ、本番環境では、 ActiveRecord::RecordNotFound は 404.html ページをレンダリングします。別名、これらは探しているプロジェクトではありません。

于 2013-02-14T22:53:40.210 に答える