Ruby On Rails: использование массивов с link_to - PullRequest
1 голос
/ 21 сентября 2009

Мне было любопытно, как использовать массивы в методе link_to в ruby ​​на рельсах, например:

Контроллер:

def index
    @test = [1,2,3]
end

Вид:

 <%= link_to "test", {:action => 'index'}, :test => @test %>

Тогда, глядя на источник, я получаю что-то с эффектом:

<a href="/index/" test="123">test</a>

Я предполагаю, что вызывается массив to_string или что-то подобное для установки значения test в html.

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

* В идеале я хотел бы сделать это без передачи параметров в URL.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 22 сентября 2009

Если вы хотите сохранить данные, вы, вероятно, должны использовать куки. Они очень просты в использовании, просто присвойте значение в действии:

cookies[:some_key] = "some value"

и получите его следующим образом:

cookies[:some_key] # returns "some value"

Однако, просто чтобы уточнить, что link_to делает в вашем примере:

<%= link_to "test", {:action => 'index'}, :test => @test %>

Тогда, глядя на источник, я получаю что-то с эффектом:

<a href="/index/" test="123">test</a>

Причина в том, что вы передаете @test третьему аргументу в link_to, который представляет собой хэш атрибутов html, поэтому он и превратился в один. Чтобы он стал параметром в ссылке, вам нужно передать его со вторым, например, {:action => 'index', :text => @test}. Как отмечалось выше, однако, это не обязательно лучший способ решения этой проблемы, и, кроме того, обычно лучше также передать имя контроллера в link_to или, что еще лучше, использовать именованный маршрут.

1 голос
/ 21 сентября 2009

Если я правильно понимаю, вы хотите сохранить данные, предоставленные пользователем после проверки формы?
Ну, Rails может сделать это без какой-либо строки вашего кода.

Исходя из предположения, что у вас есть ресурс маршрута "объекты"
В вашем контроллере:

def edit
    @object = Object.find_by_id params[:id]
end
def update
    @object = Object.find_by_id params[:id]
    if @object.update_attributes params[:object]
        # The datas have been successfully saved. You redirect wherever you want to.
    else
        render :action => 'edit'
    end
end

и по вашему мнению:

<% form_for @object do |f| %>
    <%= text_field :name %>
<% end %>

Если форма не проходит проверку, текстовое поле «имя» автоматически получает предыдущие введенные данные.

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

1 голос
/ 22 сентября 2009

Я бы просто написал помощник вида, который форматирует его в строку с хорошими разделителями, такими как запятые.

Хотя это не очень хороший способ передавать информацию. Вместо этого попробуйте переменные сеанса, файлы cookie или переменные в кодировке URL.

Лучшее совпадение с тем, что вы делаете, - это переменные с кодировкой URL, которые будут отображаться в форме, подобной этой:

<a href="/index/?test=123">test</a>
1 голос
/ 21 сентября 2009

Я предполагаю, что он использует Array # join.

Вы можете попробовать что-то вроде

:test => @test.join( ',' )

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

Но, предполагая, что связанная страница также обслуживается Rails, я думаю, что лучшим решением будет использование области флэш-памяти для хранения результатов на сервере

flash[ :submitted_params ] = params;

и в контроллере для связанной страницы

old_params = flash[ :submitted_params ] || {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...