【问题标题】:Rails 4 how to keep form data upon redirectRails 4如何在重定向时保留表单数据
【发布时间】:2016-08-10 20:24:26
【问题描述】:

我有一个视图,我在其中列出数据,并允许用户创建新记录(部分)。问题是,表单存在于索引操作下,所以如果用户输入在重定向时无效,我会丢失表单的数据。

我想保留数据,这样用户就不必重新输入一遍。

控制器:

def index  
    @instance = Instance.new
end 

def create  
    w = current_user.workspaces.find_by_id(params[:"..."]
 if w.present?
  @instance =  current_user.workspaces.find_by_id( [:"..."]).instances.create(...) 
  [:info] = "Please check your email to activate your account."
      redirect_to root_url          
    else
      flash[:info] = "Please check your data" 
      redirect_to root_url
    end 
      
end

index.html.haml

= render :partial => 'partial1'

partial1.html.haml

= form_for @instance , url: {action: "create"}  do |f|

我知道“渲染”会保留表单的数据,但是这样做:

def create  
    if something   
       ...
    else
       flash[:info] = "Please check your data" 
       render :index
    end 
          
end

我得到了错误

表单中的第一个参数不能包含 nil 或为空

= form_for @instance , url: {action: "create"} do |f|

我该如何解决? 我不想像这样在创建操作上初始化@instance

def create  
 ...
 flash[:info] = "Please check your data" 
 @instance = Instance.create
 render :index

因为我会重复代码,这些代码已经写在索引操作上。


总结一下:

我有一个复杂的索引视图,它有一个部分表单,带有一个复杂的控制器。 我无法在创建操作上呈现 :index,因为我必须加载所有索引的实例变量。 如果数据不正确,我无法创建 @instance 变量,因为我有一个嵌套表单。

【问题讨论】:

  • 当我们编写 'create' 动作时,我们通常会构建一个对象,在本例中是一个 Instance 对象,因此,我们通常会执行类似 @instance = Instance.new(params[:instance] ) 在您的“创建”操作中,您已经有了变量,并且使用“渲染:索引”时的错误将消失。
  • @instance = Instance.new 只是为表单实例化 @instance 以存储用户的输入。它不是创建一个对象。因此,在您的 controller 中,您必须检索该信息,即参数,然后使用 Instance.create 和 save 所以,您不会重复代码。
  • 如果您想在用户输入无效时保留数据,请使用render index 而不是redirect_to root_url
  • 我不能使用render :index,因为我有一个嵌套表单,在索引操作上我也加载了很多选择。我也必须在创建操作中加载它们
  • 然后使用ajax请求,如果保存成功或有任何错误则返回,然后在您的javascript代码中处理返回数据并根据您得到的数据进行处理。

标签: ruby-on-rails


【解决方案1】:

我不想在创建操作中初始化@instance...

嗯,你应该,因为你想要一个实例。但是,您应该使用表格中填写的参数“初始化”一个,而不是“创建”一个。所以做类似的事情:

def create  
 ...
 flash[:info] = "Please check your data" 
 @instance = Instance.new(params[:instance])
 render :index

【讨论】:

  • 问题是除非满足所有要求,否则我无法初始化实例,因为我有一个嵌套表单。我已经更新了代码
  • 我已经更新了代码。你应该能够做到这一点。通过这样做,您不会将其保存到数据库中,而是“记住”填写的参数。
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多