как передать переменную экземпляра в другое представление в рельсах - PullRequest
1 голос
/ 04 марта 2011

Эй. Я думаю, что я в ловушке ума здесь. Я использую Rails 2. В индексном представлении моего контроллера я настроил что-то вроде

def index
  @posts = Post.all
end

, чтобы я мог использовать @posts в своем индексе, например, каждый-делать. Я хотел бы передать @posts в пользовательское представление, где я могу снова использовать ту же самую переменную. Это я хочу сделать по ссылке из представления индекса. Примерно так:

link_to "newpage", {:controller => 'posts', :action => 'newmethod', :param => @posts}

На данный момент я создал новый метод в моем контроллере Post. Новый взгляд. И и новый маршрут к этому сайту. Какие-либо предложения? спасибо за ваше время

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Вам нужно будет свернуть эти значения во что-то, что поместится в URL, а затем декодировать их позже. Например:

# Put this in your helper method module PostsHelper
def post_ids
  @posts.collect(&:id).join(',')
end

Ваша скорректированная ссылка будет:

link_to "newpage", {:controller => 'posts', :action => 'newmethod', :param => post_ids }

Когда вы выбираете следующую страницу, вам нужно будет расшифровать их, получив их снова:

@posts = Posts.find(params[:param].split(/,/))

Нет способа передать переменную экземпляра между запросами, потому что они явно очищены.

В качестве примечания попробуйте использовать сгенерированные методы маршрута вместо объявления в стиле хеш-функции. Вероятно, вы уже указали бы маршрут в rake routes:

# Instead of { :controller => 'posts', :action => 'new', :param => post_ids }
new_post_path(:param => post_ids)

Эти сгенерированные методы на практике гораздо более читабельны и имеют преимущество в том, что их можно настроить позже, если вы захотите переосмыслить их значение, настроив таблицу маршрутизации.

Еще одно замечание: если список идентификаторов становится очень большим, вы не сможете закодировать их в URL-адрес, поскольку ограничение составляет около 1500 байт. Вместо этого вам, возможно, придется сначала сериализовать условия, использованные для генерации списка, а затем повторить их позже. Пока вы имеете дело с десятками предметов, а не с сотнями, все будет в порядке.

1 голос
/ 29 сентября 2011

Я знаю, что хранить произвольные данные в сеансе не рекомендуется, но в некоторых случаях этот подход прост и легок.

В вашем контроллере:

def balabala
  #...
  session[:your_var] = "this is the var used in another view&action!"
  # ...
end

На любых других страницах:

<%=  session[:your_var] %>

Вот и все.некрасиво, совсем не MVC.:) Рекомендуется только в очень редких случаях.:)

1 голос
/ 04 марта 2011

В вашем контроллере

def newmethod
   @posts = Post.all
end

Вы не можете передать все свои модели по ссылке! Переменная @posts в действии index исчезает после запроса

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