Как я могу получить form_for для автоматического заполнения полей на основе немодельного хэша? - PullRequest
0 голосов
/ 24 июня 2010

Я строю многошаговую форму в рельсах. Он не управляется javascript, поэтому каждая страница имеет свое собственное действие контроллера, такое как "step1", step2 "и т. Д. Я знаю, как делать многошаговые мастера с помощью JQuery, но я не знаю, как сохранить проверки рельсов на страницу, не входя в javascript отсюда и так.

В любом случае, моя модель - это объект User, но я храню все свои переменные в произвольной переменной Newuser и использую следующее в представлении:

<% form_for :newuser, :url => { :action => "step3" } do |u| %>

В контроллере я объединяю информацию о текущей странице с общим хешем, используя:

session[:newuser].merge!(params[:newuser])

Это прекрасно работает, за исключением того, что если пользователь нажимает на предыдущую страницу, поля больше не заполняются. Как мне их заселить? Нужно ли менять объект в form_for, чтобы как-то ссылаться на хэш сессии [: newuser]?

EDIT:

Полагаю, мне нужна дополнительная информация о том, как form_for автоматически заполняет поля в форме. Если она построена не на модели, а на произвольном хеше (в данном случае session[:newuser]), как мне получить ее для автоматического заполнения?

Ответы [ 2 ]

2 голосов
/ 24 июня 2010

Так мы создали многошаговую форму с проверками

class User < ActiveRecord::Base

  attr_writer :setup_step

  with options :if => :is_step_one? do |o|
    o.validates_presence_of :name
  end

  with options :if => :is_step_two? do |o|
    o.validates_presence_of :email
  end

  def setup_step
    @setup_step || 1
  end

  def is_step_one?
    setup_step == 1
  end

  def is_step_two?
    setup_step == 2
  end

  def last_step?
    is_step_two? #change this to what your last step is
  end
end

Тогда в контроллере:

UsersController
  SETUP_STEPS{1 => 'new', 2 => 'step_two'}

  def new
    @user = User.new
  end

  def step_two
  end

  def create
    @user = User.new(params[:user])

    if !@user.valid?
      render :action => SETUP_STEPS[@user.setup_step]
    elsif @user.last_step?
      @user.save
      #do stuff
    else
      render :action => SETUP_STEPS[@user.setup_step]
    end
  end
end

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

- form_for @user, :url => users_path do |f|
  - [:login, :password].each do field
    = f.hidden_field field
0 голосов
/ 30 июня 2010

А как насчет использования класса для вашего населения?

class User
  attr_accessor :credit_card, :name, :likes_fried_chicken

  def initialize(options = {})
    options.each do |key, value|
      self.send("#{key}=", value)
    end
  end
end

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

Тогда в вашем контроллере шаги:

def step_one
  @user = User.new(session[:new_user])
end

ваши формы должны продолжать работать.

Другой вариант - просто установить значение объектов формы непосредственно из хеша сеанса

- form_for :user, :url => step_2_path do |f|
  = f.text_field :name, :value => session[:new_user][:name]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...