2017-08-31 2 views
1

J'ai défini une variable d'instance dans mon ApplicationController comme ça:Comment accéder à une variable d'instance à partir d'un modèle Rails?

@team = Team.find(params[:team_id]) 

Maintenant, dans mon modèle EventsCreator Je voudrais accéder @team d'en haut:

class EventsCreator 
    # ... 

    def team_name 
    name = @team.name 
    # ... 
    end 

    # ... 
end 

Avec ce code, je reçois l'erreur suivante:

undefined method `name' for nil:NilClass

Comment dois-je accéder à des variables d'instance de ce type à partir d'un modèle? Y a-t-il une meilleure façon ou une meilleure pratique de le faire?


Edit 1:

Le modèle event.rb est le modèle qui contient des informations communes qui sont également enregistrées dans la base de données:

class Event < ApplicationRecord 
    belongs_to :team 
    attr_accessor :comment 
    ... 
end 

Le modèle events_creator.rb est en quelque sorte une extension de event.rb. Il contient une certaine logique, par ex. pour les événements récurrents:

class EventsCreator 
    include ActiveModel::Model 
    attr_accessor :beginning, :ending, :repeat_frequency, :repeat_until_date 
    ... 
end 

EventsCreator ne crée pas directement des enregistrements dans la base de données. Il fait juste une certaine logique et enregistre les données à travers le modèle Event.

Maintenant, sans avoir une relation directe avec team.rb Je veux être en mesure d'accéder à la variable d'instance @team qui est défini dans 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 

Mon fichier routes.rb est nichait tous les itinéraires à l'intérieur team parce que je besoin du team_id pour chaque action:

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 

maintenant, je ne sais pas comment accéder à la variable d'instance @team (que je la pensée est définie pour l'ensemble de l'application) à partir d'un modèle. Depuis que je suis assez nouveau à Rails, je pourrais avoir foiré des choses, s'il vous plaît dites-moi s'il y a de meilleurs moyens d'atteindre la même chose.

+0

Vous pouvez, par exemple, passer dans l'initialiseur de eventCreator. 'event_creator = EventCreator.new (@team)' –

+0

J'ai supprimé ma réponse car elle ne correspond pas à votre problème. Je suggère maintenant la même chose que @patkoperwas. – Chris

Répondre

1

Vous devrez passer le team comme argument à votre classe.

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 

Si vous prévoyez d'y compris ActiveModel::Model alors vous pouvez juste faire

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

simples

class EventCreator 

    ... 

    def team_name 
    name #will return name of class instance 
    #or do something with it 
    end 
end 
+1

Je ne sais pas comment c'est une réponse et puisque votre * explication * est "simple" je pense que vous avez tout fait mais – engineersmnky

+0

(s) il veut accéder à une propriété d'instance et j'ai essayé de montrer comment faire. Qu'est-ce qui ne va pas?-)) – marmeladze

+0

Vous avez simplement montré comment appeler une autre méthode (indéfinie) et/ou indiquer une variable locale inexistante. Vous n'avez aucune explication et certainement pas de variables d'instance. Cela s'adresse en fait à la question – engineersmnky