gpt4 book ai didi

ruby-on-rails - Rails 中的属性和构造函数

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:32 27 4
gpt4 key购买 nike

我是 Rails 的新手,甚至不知道这是否是解决我的情况的正确方法。

我有一个“Club”ActiveRecords 模型,它与“Member”模型有一个“has_many”关联。我希望登录的“俱乐部”只能管理它自己的“成员(member)”,所以在“成员(member)”模型中的每个操作开始时,我做了类似于以下的事情:

def index
@members = Club.find(session[:club_id]).members

访问正确的成员。然而,这并没有变得很干,因为我在每个 Action 中都做了同样的事情。所以我想到使用与其他语言中所谓的构造函数等同的东西。我所理解的初始化方法。然而,这不起作用,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 根本没有设置。

还有,这个解决方案真的好吗?这使得很难实现任何一种可以管理所有俱乐部成员的“ super 管理员”。关于我遗漏了什么的任何想法?

最佳答案

您可以使用 before_filter。在您的 ApplicationController 中定义过滤器(以便您可以从任何 Controller 访问它)。

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? 则重定向客户端或执行任何您想要的操作。

关于ruby-on-rails - Rails 中的属性和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2024503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com