2014-02-15 2 views
0

Хорошо, я очень смущен и немного застрял здесь, я пытаюсь передать данные в свою модель через attr_accessor, но я не могу найти правильный путь. Вот моя установка до сих пор:Rails 4 передает данные с контроллера на модель attr_accessor

class ApplicationController < ActionController::Base 
    before_filter :current_league 

    protected 

    def current_league 
    @current_league ||= Conf.all.order('updated_at ASC').last.league 
    end 
end 

class HerosController < ApplicationController 
    def index 
    @heros = Hero.all.order(:name) 
    end 
end 

class Hero < ActiveRecord::Base 
    attr_accessor :current_league 

    def some_method 
    puts current_league 
    end 
end 

<% @heros.each do |hero| %> 
    <tr> 
    <td><%= hero.some_method %></td> 
    </tr> 
<% end %> 

Теперь, как мне установить @current_league внутри моей модели? Я знаю, что у меня может быть attr_accessor внутри моей модели, но это относится только к экземпляру этой модели, но действие индекса не создает экземпляр, насколько мне известно. Может быть, кто-то может указать мне в правильном направлении. Заранее спасибо.

+0

Вы писали, что mathod в контроллере приложения находится в частной области, так как я знаю, что он будет использоваться только для всего контроллера, потому что весь контроллер наследует от контроллера приложения, поэтому использование этого метода в модели зажимает. –

+0

Проверьте мое редактирование, как вы можете видеть, при перечислении всех Героев, я хочу, чтобы он отображал 'some_method' внутри индексного представления. –

+0

его не рекомендуется вызывать контроллеров-контроллеров из ваших моделей. –

ответ

2

Переменная @heros - это коллекция экземпляров Hero. Вы можете пропустить их и установить, если хотите.

class HerosController < ApplicationController 
    def index 
    @heros = Hero.all.order(:name).each do |hero| 
     hero.current_league = current_league 
    end 
    end 
end 

Хотя он работает, я не нахожу этот ответ таким элегантным. Конечно, я не знаю, что вы делаете в полной мере, но на основе кода здесь я бы создал составной объект. Что-то вроде этого:

class HeroInLeague 

    attr_reader :league, :hero 

    def initialize(league, hero) 
    @league = league 
    @hero = hero 
    end 

    def some_method 
    # ... 
    end 

end 

Затем вы можете создавать эти объекты внутри контроллера:

class HerosController < ApplicationController 
    def index 
    @heros_in_league = Hero.all.order(:name).map { |hero| 
     HeroInLeague.new(current_league, hero) 
    } 
    end 
end 

Теперь вы создали место для методов идти, которые связаны с комбинацией героев и лиг. Почему это важно? Ну, с предыдущим подходом вы, вероятно, закончили бы методы Гера, которые не имеют никакого смысла, когда нет текущей лиги. (например, метод some_method). Это делает класс Hero немного беспорядочным. Теперь вы создали место для размещения some_method и всех его друзей.

Вы можете использовать delegators сделать интерфейс HeroInLeague немного более дружественным, так что вам не придется делать hero_in_league.hero.foo, но можно назвать hero_in_league.foo напрямую.

+0

Первый ответ выглядит многообещающим, но я просто его протестировал, и похоже, что он не будет устанавливать 'current_league', потому что, если я' puts current_league 'внутри каждого do | hero | он ничего не выведет, если я выложу его за каждый цикл, он выведет 'current_league' –

+0

. Это потому, что' puts' отправит вещь в STDOUT. Когда вы делаете IRB, вам нужно использовать возвращаемые значения. Возвращаемое значение 'puts' всегда' nil'. – iain

+0

Я не в IRB, теперь у меня есть @heros = Hero.all.order (: name) do | hero | hero.current_league = current_league end и внутри моей модели внутри some_method У меня есть puts current_league, но он ничего не выводит на моем сервере. –

Смежные вопросы