Rails: восстановление содержимого не модельной формы, которая использует form_tag - PullRequest
5 голосов
/ 09 ноября 2010

Я добился большого прогресса в своем первом приложении Rails (использующем Rails 3). Взаимодействие с MVC все идет нормально, но у меня возникают трудности с формой, которая не имеет прямого отношения к модели.

Я использую form_tag, и в случае успеха все ведет себя хорошо. Однако обработка ошибок несколько недружественна. Фактическое сообщение об ошибке сохраняется во флэш-памяти и отображается в виде layouts / application.html, но мне бы очень хотелось, чтобы форма помнила содержимое, которое пользователь только что заполнил. сбросить их значения по умолчанию.

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

Может кто-нибудь посоветовать, как это сделать?

Выдержки из соответствующих файлов:

Вид / cardsets / import.html.erb:

<%= form_tag :action => :import_data, :id => @cardset do %>
  ...
  <%= text_field_tag "separator", "", :maxlength => 1 %>
  ...
  <%= text_field_tag "formatting_line" %>
  ...etc (more fields)

Контроллеры / cardsets_controller.rb:

# POST /cardsets/1/import_data
def import_data
  success, message = @cardset.import_data(params, current_user)
  if success
    redirect_to(@cardset, :notice => message)
  else
    flash.now[:error] = message
    render :import
  end
end

Ответы [ 2 ]

9 голосов
/ 09 ноября 2010

Вторым аргументом text_field_tag ​​является значение, которым нужно заполнить поле. Попробуйте что-то вроде этого:

  <%= text_field_tag "separator", params[:separator], :maxlength => 1 %>
1 голос

Если у вашего поля есть значение по умолчанию, вы можете установить его из действия «show» для формы:

# GET
def show_form
  params[:key] = 'default'
end

# POST
def validate_form_and_act
  # Don't set it here to reuse what the user passed.
end

или непосредственно в шаблоне (менее хорошо, потому что использует || каждый раз и добавляет больше данных контроллера для просмотра):

 <%= text_field_tag 'name', params[:key] || 'default' %>
...