Ivo*_*rov 1 forms ruby-on-rails multi-step ruby-on-rails-5
我有一个标准表格,并且有几个字段组,如主要信息、地址、公司地址等。
我想构建分步表单而不是包含很多字段的一页表单。
最好的方法是什么?我找到了https://github.com/schneems/wicked但我不明白如何使用它。
小智 6
你可以试试这个。这是瑞恩·贝茨的方法。我找到它并尝试了一段时间。该示例适用于订单。
在模型中
attr_writer :current_step
validates_presence_of :shipping_name, :if => lambda { |o| o.current_step == "shipping" }
validates_presence_of :billing_name, :if => lambda { |o| o.current_step == "billing" }
def current_step
  @current_step || steps.first
end
def steps
  %w[shipping billing confirmation]
end
def next_step
  self.current_step = steps[steps.index(current_step)+1]
end
def previous_step
  self.current_step = steps[steps.index(current_step)-1]
end
def first_step?
  current_step == steps.first
end
def last_step?
  current_step == steps.last
end
def all_valid?
  steps.all? do |step|
    self.current_step = step
    valid?
  end
end 
并在控制器中
def new
  session[:order_params] ||= {}
  @order = Order.new(session[:order_params])
  @order.current_step = session[:order_step]
end
def create
  session[:order_params].deep_merge!(params[:order]) if params[:order]
  @order = Order.new(session[:order_params])
  @order.current_step = session[:order_step]
  if @order.valid?
    if params[:back_button]
      @order.previous_step
    elsif @order.last_step?
      @order.save if @order.all_valid?
    else
      @order.next_step
    end
    session[:order_step] = @order.current_step
  end
  if @order.new_record?
    render "new"
  else
    session[:order_step] = session[:order_params] = nil
    flash[:notice] = "Order saved!"
    redirect_to @order
  end
end
和 html 表单
<% form_for @order do |f| %>
  <%= f.error_messages %>
  <%= render "#{@order.current_step}_step", :f => f %>
  <p><%= f.submit "Continue" %></p>
  <p><%= f.submit "Back", :name => "back_button" unless @order.first_step? %></p>
<% end %>
希望能帮助到你。
| 归档时间: | 
 | 
| 查看次数: | 4459 次 | 
| 最近记录: |