0

ユーザーが自分のアカウントも表示できるキーホルダーを指名できるアプリがあります。アカウント所有者またはそのキー所有者のみが自分のアカウントを表示できることを意味するよりも before_filter があります。このコードは、ユーザーのホームページを表示しているどちらのユーザーに対しても正常に機能しますが、それ以上のことはできません。現在、キーホルダーとしてログインしているため、ログアウトしたり、どちらのアカウントにも「メモ」を追加したりできません (現時点では)キー所有者は、自分のアカウントとキー所有者である人物に無制限にアクセスできます)。誰でも助けてください。

before_filter は次のとおりです。

def correct_user
        @user = User.find(params[:id])

        unless (@user && current_user.id == @user.id) || ((current_user.access_id==@user.id)&&(current_user.id==@user.access_id))
          redirect_to root_path
        end
      end

たとえば、メモを作成しようとしたときに発生するエラーは次のとおりです。

ActiveRecord::RecordNotFound in NotesController#new 
Couldn't find User without an ID

before_filter の @user 行を参照しています。

キーホルダーでログインしているのに、ホームページは見れるのに何もできないのはどうしてですか?ありがとう!

アップデート:

before_filter を更新 (application_controller.rb 内):

def correct_user
        if params[:id]
          @user = User.find(params[:id])

          unless (@user && current_user.id == @user.id) || ((current_user.access_id==@user.id)&&(current_user.id==@user.access_id))
            redirect_to root_path
          end
        else
          redirect_to root_path
        end
      end

メモ作成時のコンソール出力:

Started POST "/notes" for 127.0.0.1 at 2013-02-28 14:10:49 +0000
Processing by NotesController#create as HTML
  Parameters: {"utf8"=>"V", "authenticity_token"=>"qMDHQAoC4l3Be5YZKSH1AJ9E5zS1D
kMNCW2KzUZ38gM=", "note"=>{"user_id"=>"16", "content"=>""}, "commit"=>"Update Note"}
Redirected to http://localhost:3000/
Filter chain halted as :correct_user rendered or redirected
Completed 302 Found in 98ms (ActiveRecord: 0.0ms)


Started GET "/" for 127.0.0.1 at 2013-02-28 14:10:49 +0000
Processing by PublicController#index as HTML
  ←[1m←[36mUser Load (3.0ms)←[0m  ←[1mSELECT "users".* FROM "users" WHERE "users
"."id" = 16 LIMIT 1←[0m
  Rendered public/index.html.erb within layouts/application (5.0ms)
  ←[1m←[36mTimeline Load (3.0ms)←[0m  ←[1mSELECT "timelines".* FROM "timelines"
WHERE "timelines"."user_id" = 16 LIMIT 1←[0m
  ←[1m←[36mMessageBoard Load (2.0ms)←[0m  ←[1mSELECT "message_boards".* FROM "me
ssage_boards" WHERE "message_boards"."user_id" = 16 LIMIT 1←[0m
  Rendered partials/_menuoptions.html.erb (53.0ms)
Completed 200 OK in 551ms (Views: 535.0ms | ActiveRecord: 16.0ms)
4

3 に答える 3

0

単一のアクションで検証しすぎていると思いますが、とにかく問題はget / postリクエストにあるようです。コントローラーのアクションに取得するIDがないため、コントローラーに送信されるパラメーターを添付できますか?コンソールからそれらをコピーすると、読みやすくなります...

 "note"=>{"user_id"=>"16", "content"=>""}

ユーザーIDを取得するために使用params[:note][:user_id]する必要があります。必要なことを実行できるようにするには、ユーザーIDを使用して非表示フィールドを追加する必要があります。 Railscastを見たことがありますか?、そこに役立つヒントがたくさん見つかると確信しています。たとえば、これを見てください。

Railscast Cancan

それが役に立てば幸い...

于 2013-02-28T13:46:09.533 に答える
0

試す:

def correct_user
            if current_user
              @user = User.find(current_user.id)

              unless (@user && current_user.id == @user.id) || ((current_user.access_id==@user.id)&&(current_user.id==@user.access_id))
                redirect_to root_path
              end
            else
              redirect_to root_path
            end
          end

実際、params[:id]ここにはそのようなものはありません。はcurrent_userチェックしているユーザーなので、上記のように直接見つけることができますcurrent_user.id。コードを上記に置き換え、他のコードが見つかった場合は可能な限り修正してください。あくまで実装のアイデアです。

于 2013-02-28T14:36:31.760 に答える
0

notes/new に移動すると、id パラメータが指定されていないため、この例外が発生します。

params[:id] が存在するかどうかを最初に確認する必要があります。

def correct_user
  if params[:id]
    @user = User.find(params[:id])

    unless (@user && current_user.id == @user.id) || ((current_user.access_id==@user.id)&&(current_user.id==@user.access_id))
      redirect_to root_path
    end
  else
    redirect_to root_path
  end
end

notes/new へのリンクでは、ユーザーの id パラメータを指定する必要があります。

<%= link_to "New note on #{@user.name}", new_note_path(id: @user.id) %>
于 2013-02-28T13:48:32.833 に答える