2014-09-19 83 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