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 行。

为什么当我作为keyholder登录时,我可以查看主页,但不能执行其他操作?谢谢!

更新:

更新 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"=>""}

你必须用来params[:note][:user_id]获取用户 ID,你必须添加一个带有用户 ID 的隐藏字段才能做你想做的事情,如果你问我,我不认为这是一个好习惯,有你看过任何 railscast 吗?,我很确定你可以在那里找到很多有用的提示,例如看看这个:

Railscast 康康舞

希望能帮助到你...

于 2013-02-28T13:46:09.533 回答
0

当你去 yo 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 回答
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 回答