我对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,但这不会解决问题,因为选民仍然需要访问选举才能看到描述。
感谢您的帮助!
答案 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])
解决问题。