#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’ не работает.