在我的Rails 4应用程序中,我有复选框,我需要它们在刷新页面后保持其状态(选中或取消选中),直到用户更改状态。
这是我的代码:
<% @album.audios.each do |audio| %>
<%= check_box_tag "audio_ids[]",audio.id ,nil,class: "song"%>
<% end %>
我坚持这个。有什么更好的方法呢?我可以在这里使用会议吗?
答案 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_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 %>
需要注意的重要事项&#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对象来查找您提交的数据。