Rails :: Как добавить атрибуты к модели перед отправкой ее в представление

#ruby-on-rails #mongoid

#ruby-on-rails #mongoid

Вопрос:

ради всего святого, это не работает:

 def index
    @events = Event.all
    @events.map { |e| e[:user_subscribed] = '55555' }

    @events.each do |e|
      puts e.name
      puts e[:user_subscribed] # nil !
    end
end
  

Я пробовал e[:user_subscribed] e.user_subscribed , и это просто не работает.

Как я могу добавить атрибуты в @events (мне не нужно их сохранять)?

обновление: я в основном беру события из базы данных и добавляю атрибут на основе current_user перед отправкой их в представление. Следующие строки кода:

 respond_to do |format|
  format.html # index.html.erb
end
  

Ответ №1:

Если user_subscribed это виртуальный атрибут Event модели, вы должны установить / получить его, используя обычный установщик / получатель, а не установщик / получатель массива.

 def index
  @events = Event.all
  @events.each { |e| e.user_subscribed = '55555' }
  @events.each do |e|
    puts e.name
    puts e.user_subscribed
  end
end
  

Комментарии:

1. это не работает. puts e.user_subscribed приведет к пустой строке, так как e.user_subscribe равно нулю. просто протестировал его еще раз. =/

2. Это ваш ответ. Но сначала вам нужно определить виртуальный атрибут в вашей модели, например, так : attr_accessor :user_subscribed .

Ответ №2:

Вам необходимо сохранить событие после его изменения:

 @events = Event.all.each do |e|
  e.user_subscribed = '55555'
  e.save!
end
  

Редактировать: большая часть логики, вообще говоря, должна быть помещена в модель, где это возможно (толстая модель, тонкий контроллер). Итак, вы должны сделать что-то вроде этого:

 class Event < ActiveRecord::Base
  def something_based_on_the_current_user(user)
    #some logic here
  end
end
  

вызовите его в представлении (или контроллере) следующим образом:

 @event.something_based_on_current_user(@user)
  

Комментарии:

1. user_subscribed основан на current_user . Я не хочу хранить всех пользователей, подписавшихся на событие, в базе данных. Как мне получить все события, добавить атрибут к каждому из них, а затем поместить это в представление?

2. Хм, я не совсем уверен, что вы пытаетесь сделать, но похоже, вам следует использовать ассоциации ActiveRecord (т. Е. an Event has_many :subscribed_users )

3. но это то, что нужно вычислять во время выполнения. Я не могу поверить, что нет способа просто добавить атрибут в @event перед добавлением его в контроллер.

4. Мне очень жаль, я все еще не совсем понимаю, что вы пытаетесь сделать. Не могли бы вы отредактировать свой пост, чтобы объяснить, чего вы пытаетесь достичь концептуально, в дополнение к нерабочему коду.

5. Спасибо, но это все равно не работает. Независимо от того, как я не могу добавить атрибут к модели. self.user_subscribed = ‘something’ не работает.