RoR: Как я могу использовать переменную из одного действия в другое в том же контроллере? - PullRequest
0 голосов
/ 30 января 2012

В моем контроллере у меня есть два действия: "Select_users" и "Make_something". В «Select_users» я получаю @var со списком пользователей (эти пользователи генерируются из поиска с формой в том же представлении), и мне нужно сделать вставку для каждого из них ... как:

   @var.each do |v|
     Table.create(:atribute => v.name)
   end

Когда у меня есть список избранных пользователей, я использую кнопку «Отправить», чтобы отправить меня в действие «Make_something».

Поэтому я подумал «передать» переменную @var в действие «Make_something» для создания этого создания, но я не могу использовать @var в «Make_something», потому что он доступен только в «Select_users».

Я читал о фильтрах, но думаю, что они не могут помочь мне с этой проблемой.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 30 января 2012

вы можете использовать before_filter .Добавьте приведенный ниже код перед любым определением действия, т. Е. После определения класса.

before_filter :initialize_variable, :only => [:select_users, :make_something]

это гарантирует, что method initialize_variable будет called whenever любым из тех других methods, вызываемых иэто будет initialize variable, как показано ниже.И тогда вы можете использовать переменную напрямую.

def initialize_variable
  @required_var = // get the details
end

ИСПОЛЬЗОВАНИЕ:

def select_users
  @required_var.each //......
end

и

def make_something
   @required_var.each //......
end
1 голос
/ 30 января 2012

Если у вас есть код, общий для нескольких методов, извлеките его в другой метод.

def select_users
  @var = go_get_those_users
end

def make_something
  go_get_those_users.each do |v| Table.create(:atribute => v.name) end
end

private
def go_get_those_users
  # do whatever you need to populate your collection
  return [] 
end

В качестве альтернативы вы можете передать список идентификаторов выбранных пользователей в форме, которая отправляет сообщение "make_something",Или, если вы действительно хотите как-то сохранить это (я предполагаю, что это некая форма "многошагового мастера форм" некоторого описания), используйте пользователь db, а не сеанс - используйте модель "мастера", котораясохраняется в БД.Каждый шаг будет затем передавать wizard_id и сохранять его собственные значения в мастере - это может иметь нормальные ассоциации AR (для выбранных вами пользователей) через отношения.

0 голосов
/ 30 января 2012

Как вы можете гарантировать, что одно действие будет выполнено раньше, чем другое.

Если вы хотите, чтобы эти данные сохранялись для определенного пользователя, сохраните их в модели.

Возможно, имеетсяwizard модель с user_id и полями для различных шагов.

если вы хотите, чтобы она сохранялась только в этом сеансе, используйте session[:something]

Проверьте это http://railscasts.com/episodes/119-session-based-model

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...