【问题标题】:Checkboxes need to be checked after page refresh页面刷新后需要勾选复选框
【发布时间】:2014-09-19 17:22:33
【问题描述】:

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

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

我被这个困住了。这样做的更好方法是什么?我应该在这里使用会话吗?

【问题讨论】:

  • @Maddy 当有人介绍自己时,必须是“我”,而不是“我”。

标签: javascript jquery ruby-on-rails ruby-on-rails-4


【解决方案1】:

您在视图代码中传递 nil 代替 check 。您应该为选中的元素传递 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)

【讨论】:

  • 您还应该使用.each 而不是for。只是一个 Ruby 最佳实践 :)
  • 对不起,我正在寻找复选框以保持其状态(选中或未选中)如果网页也刷新.....
  • 在这种情况下,您可以从数据库中迭代值。
  • 这是一个好主意,但每次点击的 db 条目意味着这不是一个好的做法是吗?...我正在寻找客户端解决方案(javascript 或会话)...。跨度>
  • 如果您想在用户刷新页面时保存选中的值,那么您需要使用 ajax 在选中和取消选中复选框字段时更新数据库中的记录。并从 db 中迭代检查值
【解决方案2】:

如果您想保留复选框的状态,您需要在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 %>

这里有很好的参考: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 对象来保存您提交的数据。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2021-05-17
  • 2014-04-03
  • 2013-08-17
相关资源
最近更新 更多