如果您想保留复选框的状态,您需要在session 中设置数据,或者以某种方式将其绑定到您的表单的ActiveRecord object。
我先详细介绍一下表格...
表格
您当前的设置是您使用的是form_tag
您必须知道form_tag 和form_for 之间的区别在于前者具有独立数据,而后者的数据来自ActiveRecord 对象。很多人的问题是因为他们不知道其中的区别,他们可能会对如何实现这两种方法感到困惑,这可能是这里的一个问题。
我会推荐使用form_for:
#app/views/albums/edit.html.erb
<%= form_for @album do |f| %>
<% @album.audios.each do |audio| %>
<%= fields_for 'audio[]', audio do |audio_fields| -%>
<%= audio_fields.check_box nil %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
这里有很好的参考:Syntax for form_for when building an array from checkboxes
另一种方法可能是collection_check_boxes:
#app/views/albums/edit.html.erb
<%= form_for @album do |f| %>
<%= f.collection_select_boxes :audio_ids, @album.audios, :id, :name %>
<%= f.submit %>
<% end %>
关于这个“方法”需要注意的重要一点是,由于复选框的值直接与您的@album ActiveRecord 对象相关联,它使您能够通过将数据保存到数据库来“持久化”数据.
我不知道您要使用当前设置实现什么目标,但要持久保存数据 - 甚至在视图之间 - 您需要确保有一些地方可以保存数据(数据库或饼干之类的东西)
会话
会话将是一个合乎逻辑的选择,尽管您没有说明您想要实现的目标,我不知道它们适合什么。
如果要“提交”您的表单,您可以在向其发送请求的控制器操作中设置数据的“会话”cookie。例如,如果您将请求发送到albums#update,您将希望将会话存储在该操作中:
#app/views/albums/edit.html.erb
<% @album.audios.each do |audio| %>
<%= check_box_tag "audio_ids[]", audio.id, session[:album_ids][audio.id], class: "song"%>
<% end %>
#app/controllers/albums_controller.rb
class AlbumsController < ApplicationController
def update
session[:album_ids] = params[:album_ids]
@album = Album.find params[:id]
@album.audios.each do |audio|
session[:album_ids][audio.id] = params[:album_ids][audio.id]
end
end
end
无状态
最后,您需要了解"stateless" 协议(HTTP 就是其中之一)的工作原理。这一点很重要,因为通过“无状态”,应用程序与提交数据的地点或时间没有任何关系——实质上它将每个资源视为一个单独的资源。
您遇到的问题是您必须持久化您的数据 - 只有当您有办法将用户的身份(会话)与他们提交的数据相匹配时,才会发生这种情况,或者想找回来。
在您的情况下,您需要使用session cookie 或 ActiveRecord 对象来保存您提交的数据。