如何在Rails自定义多步骤表单上创建红宝石而不是使用gem [英] How to create a ruby on rails custom multi-step form instead of using gem

查看:73
本文介绍了如何在Rails自定义多步骤表单上创建红宝石而不是使用gem的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个标准的表格,几乎没有字段组,例如主要信息,地址,营业地址等.

I have a standard form and there are few fields groups like main information, address, business address, etc.

我想建立一个分步的表单,而不是包含很多字段的一页表单.

I'd like to build step-by-step form instead one-page form with a lot of fields.

做到这一点的最佳方法是什么?我发现 https://github.com/schneems/wicked ,但我不知道如何使用它.

What is the best way to do that? I found https://github.com/schneems/wicked but I didn't understand how to use it.

推荐答案

您可以尝试一下.这是瑞安·贝茨(Ryan Bates)的方法.我找到它并在一段时间前尝试. 该示例适用于订单.

You can try this. This is Ryan Bates method. I found it and try some time ago. The example applies to orders.

在模型中

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 %>

希望它会有所帮助.

这篇关于如何在Rails自定义多步骤表单上创建红宝石而不是使用gem的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆