Ruby on Rails:在视图之间保存控制器实例变量的正确方法?



这可能不是正确的做事方式,但老实说,我不确定该怎么做。

我正在创建一个导入系统,该系统将序列化字符串作为输入,将其反序列化为 ActiveRecord 对象,然后向用户显示一个确认屏幕,其中显示将导入的所有项目,当用户按下"保存"按钮时,所有项目都会被保存。

我已经完成了反序列化,并构建了确认页面,以便它显示将要导入的每个项目。

最后一步是一个按钮,按下该按钮时将保存每个项目。

我认为这就像在我看来有这样的事情一样简单:

<%= button_to 'Save Items', :action=> :save_items %>

在我的控制器中:

def save_items
@items_to_save.each do |item|
item.save
end
end

(@items_to_save 是 ActiveRecord 对象的数组)

但是,由于button_to似乎实际上导致了新请求,因此一旦按下按钮,@items_to_save就会丢失。

是否有更好的方法将视图上的按钮绑定到控制器操作,以便不会触发新请求并且我的项目不会丢失?

您需要将一些信息添加到您的链接(参数)中。

你是对的,@items_to_save丢失了。控制器全局变量@只能用于视图 - 在使用另一个操作后不能相反。

因此,您可以先选择项目中的所有 id,将它们放在数组中,在渲染时将它们添加到按钮参数中,然后在单击按钮时循环访问它们。

# deserialize it into ActiveRecord objects - action
# don't know how your looks - i hope it's understandable 
...
@items_ids = @active_record_objects.ids
...

然后在您的视图中,将它们添加到您的button_to以便您可以在控制器操作save_items中使用这些 id。

<%= button_to "Save Items", action: :save_items, params: {ids: @items_ids} %> 

现在,您可以循环访问它们并保存!

def save_items
Item.where(id: params[:ids]).each(&:save)
end