【问题标题】:Rails controller : How to pass parameters between actions in wizard style?Rails 控制器:如何在向导风格的动作之间传递参数?
【发布时间】:2014-03-02 19:03:45
【问题描述】:

我正在尝试构建一个向导风格的网站来帮助创建一个对象。
每一步用户输入一些参数。只有在最后一步提交所有参数时,我才想在 DB 中创建和持久化对象。

class ExperimentsController < ApplicationController
  def wizard_step_1
    render template: "experiments/wizards/step1"
  end

  def wizard_step_2
    render template: "experiments/wizards/step2"
  end

  def wizard_step_3
    binding.pry
    # how to access params in step 1 & 2 here?
  end
end

View step1 below:
<%= form_tag(action: 'wizard_step_2') do %>
    <%= text_field_tag("user_name") %>
    <%= submit_tag("Next >>") %>
<% end %>

View step2 below:
<%= form_tag(action: 'wizard_step_3') do %>
    <%= text_field_tag("user_email") %>
    <%= submit_tag("Next >>") %>
<% end %>

我没有把路线信息放在这里,因为它已经过测试了。当用户访问step1并输入用户名时,提交表单控件时转到wizard_step_2并显示视图step2。在这里,用户输入电子邮件,当单击提交按钮时,执行转到操作 wizard_step_3。 那么我的问题是如何获取用户名和用户在前面步骤中输入的电子邮件?

我曾考虑过 gem Wicked 和 Rails 缓存等,但它们或多或少无法满足我的需求。有没有一种体面的方法来做到这一点?

【问题讨论】:

    标签: ruby-on-rails view controller wizard


    【解决方案1】:

    我在这方面没有丰富的经验,但您可能会受益于:Wizard Forms Railscast

    我想这种类型的设置会将step 1step 2 等参数保存为session variables

    class ExperimentsController < ApplicationController
      def wizard_step_1
        render template: "experiments/wizards/step1"
      end
    
      def wizard_step_2
        render template: "experiments/wizards/step2"
    
        #Create session vars from step1 
        session[:user][:name] = params[:user_name]
      end
    
      def wizard_step_3
        binding.pry
    
        #Step2 is already passed as params ;)
        params[:user_name] = session[:user][:name]   
      end
    end
    
    View step1 below:
    <%= form_tag(action: 'wizard_step_2') do %>
        <%= text_field_tag("user_name") %>
        <%= submit_tag("Next >>") %>
    <% end %>
    
    View step2 below:
    <%= form_tag(action: 'wizard_step_3') do %>
        <%= text_field_tag("user_email") %>
        <%= submit_tag("Next >>") %>
    <% end %>
    

    我知道这个例子不是很枯燥,但它是我开始研究的基础。本质上,您需要能够在对象实例之间持久化数据,这完全适合sessions

    【讨论】:

    • 谢谢,如果我不想将数据存储在数据库中,会话存储似乎是我唯一的选择。
    • 或者普通的cookies,但这是依赖于客户端的,而不是依赖于服务器的
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多