Rails控制器:如何在向导样式的操作之间传递参数?

时间:2014-02-06 02:10:13

标签: ruby-on-rails view controller wizard

我正在尝试构建一个向导式网站来帮助创建一个对象。
每个步骤用户输入一些参数。只有在最后一步提交所有参数时,我才想在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并显示查看步骤2。这里用户输入电子邮件,当单击提交按钮时执行动作wizard_step_3。 那么我的问题是如何在之前的步骤中获取用户名并通过电子邮件发送用户输入信息?

我想过gem Wicked,Rails缓存等等,或多或少都没有满足我的需求。这样做有一个体面的方式吗?

1 个答案:

答案 0 :(得分:0)

我对此没有丰富的经验,但您可以从中获益: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