2014-09-19 42 views
2

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

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

我坚持这一点。有什么更好的方法来做到这一点?我可以在这里使用会话吗?

+0

@Maddy当有人讲述自己时,它必须是“我”,而不是“我”。 – Regent 2014-09-19 04:42:01

回答

2

您将在您的查看代码中通过零位代码。您应该为checked元素传递true,在非checked元素上传递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

你也应该使用'.each'而不是'for'。只是一个红宝石的最佳做法:) – mmichael 2014-09-19 04:36:50

+1

对不起,我正在寻找复选框,以保持其状态(选中或未选中)如果网页刷新也..... ..... – Navin 2014-09-19 04:38:02

+0

在这种情况下,你可以从你的数据库迭代值。 – 2014-09-19 04:39:17

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 %> 

注意有关该 “办法” 最重要的是由于复选框的值直接与您的ActiveReco @album rd对象,它使您能够通过将数据保存到数据库来“坚持”数据。

我不知道你想用当前的设置实现什么,但要坚持数据 - 即使在视图之间 - 你需要确保你有一个地方可以保存数据(DB或像一个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 

无国籍

最后,你想看看到"stateless"协议的工作(其中HTTP非常多)。这很重要,因为通过“无状态”,应用程序不会影响数据提交的地点或时间 - 实质上它将每个资源视为一个个体。

您的问题是,您必须持续存在您的数据 - 只有在您有方法将用户的身份(会话)与他们提交的数据或要检索的数据相匹配时才会发生。

对于您的情况,您需要使用session Cookie或ActiveRecord对象来查找您提交的数据。

+1

感谢您在这个链接的详细解答我已经给予我详细的需求看到,谢谢你Rich Peck http://stackoverflow.com/questions/25930992/music-player-select-some-songs-and-play-in-rails – Navin 2014-09-19 09:46:03