【问题标题】:How to create a ruby on rails custom multi-step form instead of using gem [closed]如何在 Rails 上创建自定义多步骤表单而不是使用 gem [关闭]
【发布时间】:2018-06-22 15:52:27
【问题描述】:

我有一个标准表格,主要信息、地址、公司地址等字段组很少。

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

最好的方法是什么?我找到了https://github.com/schneems/wicked,但我不明白如何使用它。

【问题讨论】:

    标签: ruby-on-rails forms ruby-on-rails-5 multi-step


    【解决方案1】:

    你可以试试这个。这是瑞安贝茨的方法。我发现它并尝试了一段时间。 该示例适用于订单。

    在模型中

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

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多