2009-09-21 8 views
1

мне было интересно, как использовать массивы в методе link_to в рубин на рельсах, например:Ruby On Rails: использование массивов с link_to

Контроллер:

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

Вид:

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

При взгляде на источник затем я получаю что-то, что действует:

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

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

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

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

спасибо.

+0

Вы могли бы быть более конкретным? какие данные должны быть представлены? просто список строк или цифр? – giorgian

+0

Да, я пытаюсь передать массив, содержащий только строки и числа. – Evan

ответ

2

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

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

Мое предположение, что он использует Array # join.

Вы могли бы попробовать что-то вроде

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

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

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

flash[ :submitted_params ] = params; 

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

old_params = flash[ :submitted_params ] || {} 
1

Если я хорошо понимаю, вы хотите сохранить данные, представленные пользователем после проверки формы?
Well 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

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

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

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

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