页面刷新后需要选中复选框
Checkboxes need to be checked after page refresh
在我的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_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 %>
这里很好的参考:从复选框构建数组时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对象来持久化您提交的数据。
- 如何在刷新时重新填充表单中的复选框并将表单值发布到页面
- 复选框筛选仅适用于刷新Angular2
- Angular 1:最后一个复选框没有'刷新页面后不要保持选中状态
- 如何使用复选框jQuery取消选中并刷新数据
- Javascript自动刷新切换复选框
- 如何刷新 jquery 移动复选框主题
- 取消选中 Mozilla 刷新的复选框
- 复选框在页面刷新后保持选中状态
- 角度复选框不会刷新,但行为会发生
- 刷新 JQuery Mobile 中的列表视图和复选框
- 选中复选框时,将值附加到 JSON 网址并自动刷新 JSON
- 刷新并提交后,保持复选框处于选中状态
- 我需要刷新表单,但仍然保持复选框的值不变
- 如何在页面刷新后保持复选框处于选中状态
- 刷新页面后,javascript保持复选框处于选中状态
- 在页面刷新后保持单击的复选框状态
- 页面刷新后保持复选框处于选中状态
- Jquery mobile-使用pageinit刷新复选框
- 页面刷新后需要选中复选框
- 根据Oracle APEX中的复选框自动刷新IRR