我是铁道新手,甚至不知道这是否是解决我情况的正确方法。
我有一个“Club”ActiveRecords模型,它与“会员”模型有“has_many”关联。我希望登录的“俱乐部”只能管理它自己的“会员”,所以在“会员”模型的每个动作的开头,我做了类似以下的事情:
def index
@members = Club.find(session[:club_id]).members
访问正确的成员。然而,这并没有因为我在每个动作中做同样的事情而变得非常干燥。所以我想到使用与其他语言中的构造函数等效的东西。正如我所理解的那样初始化方法。然而,这不起作用,this告诉我为什么,并提出了另一种选择。 after_initialize。
def after_initialize
@club = Club.find(session[:club_id])
end
def index
@members = @club.members
....
似乎无论如何都不起作用。指向原因的任何指示?
You have a nil object when you didn't expect it!
The error occurred while evaluating nil.members
让我觉得@club var根本没有设置。
此外,这个解决方案真的很好吗?这使得很难实现任何一种能够管理所有俱乐部成员的“超级管理员”。关于我遗失某些东西的任何想法?
答案 0 :(得分:5)
您可以使用before_filter。 在ApplicationController中定义过滤器(以便您可以从任何控制器访问它)。
class ApplicationController < ActionController::Base
# ..
protected
def load_members
@members = if session[:club_id]
Club.find(session[:club_id]).members
else
[]
end
end
end
然后,在您需要的任何操作之前加载过滤器。 例如
class ClubController < ApplicationController
before_filter :load_members, :only => %w( index )
def index
# here @members is set
end
end
否则,请使用延迟加载。您可以使用相同的load_members
并在需要时随时调用它。
class ClubController < ApplicationController
def index
# do something with members
load_members.each { ... }
end
end
当然,您可以自定义load_member
以引发异常,如果@members.empty?
重定向客户端或执行任何操作。
答案 1 :(得分:3)
您想要使用before_filter。
class MembersController < ApplicationController
before_filter :find_club
def index
@members = @club.members
end
private
def find_club
@club = Club.find(session[:club_id])
end
end
答案 2 :(得分:0)
我是一个名为Rolerequirement的插件的粉丝。它允许您创建自定义角色并由控制器应用它们:http://code.google.com/p/rolerequirement/