【发布时间】:2017-09-04 16:24:40
【问题描述】:
我在ApplicationController 中定义了一个实例变量,如下所示:
@team = Team.find(params[:team_id])
现在,在我的EventsCreator 模型中,我想从上面访问@team:
class EventsCreator
# ...
def team_name
name = @team.name
# ...
end
# ...
end
使用该代码,我收到以下错误:
nil: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 没有直接关系,我希望能够访问在application_controller.rb 中定义的实例变量@team:
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 很陌生,我可能会搞砸一些事情,请告诉我是否有更好的方法来实现同样的目标。
【问题讨论】:
-
例如,您可以在 EventCreator 的初始化程序中传递它。
event_creator = EventCreator.new(@team) -
我删除了我的答案,因为它不适合您的问题。我现在建议和@patkoperwas 一样。
标签: ruby-on-rails ruby activemodel