如何从Rails模型访问实例变量?

时间:2017-08-31 10:40:16

标签: ruby-on-rails ruby activemodel

我在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很陌生,我可能搞砸了,请告诉我是否有更好的方法来实现相同的目标。

2 个答案:

答案 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