页面刷新后需要检查复选框

时间:2014-09-19 04:31:05

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

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

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

我坚持这个。有什么更好的方法呢?我可以在这里使用会议吗?

2 个答案:

答案 0 :(得分:2)

您传递的是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)

答案 1 :(得分:1)

如果您要保留复选框的状态,则需要将数据设置为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 %>

需要注意的重要事项&#34;方法&#34;是因为复选框的值直接与您的@album ActiveRecord对象绑定,它使您能够“坚持”#34;将数据保存到数据库中。

我不知道您在当前设置中尝试实现的目标,但要保留数据 - 甚至在视图之间 - 您需要确保在某个地方可以保存数据(无论是数据库还是类似cookie的东西


<强>会话

会话将是一个合乎逻辑的选择,虽然你没有说明你想要实现的目标,但我不知道他们适合的地方。

如果您的表单是&#34;已提交&#34;,您就可以设置&#34;会话&#34;您发送请求的控制器操作中的数据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对象来查找您提交的数据。

相关问题