页面刷新后需要选中复选框

Checkboxes need to be checked after page refresh

本文关键字:复选框 刷新      更新时间:2023-09-26

在我的Rails 4应用程序中,我有复选框,我需要它们在刷新页面后保持状态(选中或未选中),直到用户更改状态
这是我的代码:

<%  @album.audios.each do |audio| %>
  <%= check_box_tag "audio_ids[]",audio.id ,nil,class: "song"%>
<% end %>

我受够了。做这件事的更好方法是什么?我可以在这里使用会话吗?

您传递的是nil,而不是视图代码中的checked。您应该为已检查元素传递true,为未检查元素传递false。

<% for audio in @album.audios %>
  <%= check_box_tag "audio_ids[]",audio.id ,(true/false),class: "song"%>
<% end %>

以下是复选框标记的语法:

check_box_tag( name, value, checked, html_and_other_options)

如果你想保持复选框的状态,你要么需要在session中设置数据,要么以某种方式将其绑定到表单的ActiveRecord object中。

我先详细介绍一下表格。。。


表单

您当前的设置是使用form_tag

您必须知道form_tagform_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 %>

这里很好的参考:从复选框构建数组时form_for的语法

另一种方法可能是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的东西)


会话

会话将是一个合乎逻辑的选择,尽管由于你还没有说明你想要实现什么,我不知道它们适合哪里。

如果您的表格要"提交",您可以在发送请求的控制器操作中设置数据的"会话"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

无状态

最后,您将希望了解"无状态"协议(HTTP是其中的一个)的工作原理。这一点很重要,因为由于是"无状态"的,应用程序与数据提交的地点或时间无关——本质上,它将每个资源视为一个单独的资源。

您面临的问题是,您必须保存您的数据-只有当您有办法将用户的身份(会话)与他们提交或想要检索的数据相匹配时,才会发生这种情况。

在您的情况下,您将希望使用session cookie或ActiveRecord对象来持久化您提交的数据。