【发布时间】: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