我在ApplicationController
中定义了一个实例变量:
@team = Team.find(params[:team_id])
现在,在我的EventsCreator
模型中,我想从上方访问@team
:
class EventsCreator
# ...
def team_name
name = @team.name
# ...
end
# ...
end
使用该代码我收到以下错误:
未定义的方法`name'为零:NilClass
我应该如何从模型中访问这样的实例变量?有更好的方法或更好的做法吗?
修改1:
event.rb
模型是包含公共信息的模型,该信息也保存在数据库中:
class Event < ApplicationRecord
belongs_to :team
attr_accessor :comment
...
end
events_creator.rb
模型是event.rb
的扩展。它包含一些逻辑,例如重复事件:
class EventsCreator
include ActiveModel::Model
attr_accessor :beginning, :ending, :repeat_frequency, :repeat_until_date
...
end
EventsCreator
不会直接在数据库中创建记录。它只是做了一些逻辑并通过Event
模型保存数据。
现在与team.rb
没有直接关系我希望能够访问@team
中定义的实例变量application_controller.rb
:
class ApplicationController < ApplicationController::Base
before_action :set_team_for_nested
private
def set_team_for_nested
@team = Team.find(params[:team_id])
end
end
我的routes.rb
文件将所有路由嵌套在team
中,因为我需要team_id
来执行每个操作:
Rails.application.routes.draw do
resources :teams do
resources :events
get '/events_creator', to: 'events_creator#new', as: 'new_events_creator'
post '/events_creator', to: 'events_creator#create', as: 'create_events_creator'
end
end
现在我不知道如何从模型访问@team
实例变量(我认为是为整个应用程序定义的)。由于我对Rails很陌生,我可能搞砸了,请告诉我是否有更好的方法来实现相同的目标。
答案 0 :(得分:1)
您必须将team
作为参数传递给您的班级。
class EventsCreator
attr_reader :team
def initialize(team)
@team = team
end
def some_method
puts team.name
end
end
# Then in your controller you can do this
def create
EventsCreator.new(@team)
end
如果您计划加入ActiveModel::Model
,那么您可以
class EventsCreator
include ActiveModel::Model
attr_accessor :team
def some_method
puts team.name
end
end
# And then in your controller it's the same thing
def create
EventsCreator.new(@team)
end
答案 1 :(得分:-1)
简单
class EventCreator
...
def team_name
name #will return name of class instance
#or do something with it
end
end