禁用logged_in过滤器以获取精确的URL

时间:2014-12-04 08:08:53

标签: ruby-on-rails authentication

我对Rails很新,所以如果我不使用正确的条款,请告诉我。

我正在尝试创建一个让人们创建自己选举的网站。该网站的最新版本可用here

创建选举的人必须注册。选举只有登录成员才能查看和编辑(你不希望任何人看到你的选举)。

出于这个原因,我在选举控制员的开头有这个:

class ElectionsController < ApplicationController
    before_filter :logged_in?

登录用户通过以下网址访问选举:http://spo2tu.be:8001/elections/:id

创建选举的人定义了一个必须投票给候选人的选民名单。 会发生什么,对于每个选民,生成一个唯一的URL并通过邮件发送。该网址格式为:http://spo2tu.be:8001/elections/:id/votes/:long_generated_id

示例http://spo2tu.be:8001/elections/1/votes/Y2_8TDL8Hkpz2MzzV_bpgw

我的问题是,由于before_filter的遗产,非logging_in用户在到达此URL时会看到错误。

错误如下:

undefined method `elections' for nil:NilClass

@election = current_user.elections.find(params[:election_id])

我认为发生的事情是,由于选举在过滤之前有一个logged_in,因此无法在更深的URL中获得对它的引用。

由于这些网址是唯一的,临时的和生成的,我想让有权访问这些网址的人也参与选举;因此绕过了before_filter。

实现这一目标的正确方法是什么? 我看到的一个可能的解决方案是避免嵌套并直接将URL更改为类http://spo2tu.be:8001/votes/Y2_8TDL8Hkpz2MzzV_bpgw,但这不会解决问题,因为选民仍然需要访问选举才能看到描述。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您应该使用方法指定要检查用户是否已登录。

所以将before_filter :logged_in?更改为before_filter :logged_in?, only: [:edit, :new, :destroy]

您可能正在使用this method登录。 这取决于为current_user方法提供的会话。

所以我建议你不要用它来查找它,但你在url中使用params来指定哪个用户试图访问选举。

希望它有所帮助。 :)

答案 1 :(得分:0)

因此,在Ramon Gebben的建议之后,问题确实来自这条线:

@election = current_user.elections.find(params[:election_id])

由于用户未登录,因此未定义 current_user ,从而导致错误。

将此行更改为

@election = Election.find(params[:election_id])

解决问题。