2013-03-26 91 views
0

我有一個模型名稱「Deal」和一個名爲「Days」的字符串。我希望能夠讓我的用戶選擇交易的天數。可能是一天(星期一)或多天(星期一,星期三,星期五......)我該怎麼做?Rails複選框 - 允許用戶選擇本週的日期

我嘗試這樣做:

<div class="field"> 
    <%= f.label :monday %> 
    <%= f.check_box :days, {}, "monday", "monday" %> 
</div> 

<div class="field"> 
    <%= f.label :tuesday %>  
    <%= f.check_box :days, {}, "tuesday", "tuesday" %> 
</div> 

但是它覆蓋只顯示 「星期二」 的第一選擇。

我必須在模型中爲每週的每天添加一個字符串,還是有更簡單的選項?謝謝。

deals_controller:

class DealsController < ApplicationController 

def index 
    @deals = Deal.all 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @deals } 
    end 
end 

def show 
    @deal = Deal.find(params[:id]) 

    respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @deal } 
    end 
end 

def create 
    @deal = Deal.new(params[:deal]) 
    @deal.created_at = Time.now 
    @deal.user = current_user 

    respond_to do |format| 
    if @deal.save 
     format.html { redirect_to @deal, notice: 'Deal was successfully created.' } 
     format.json { render json: @deal, status: :created, location: @deal } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @deal.errors, status: :unprocessable_entity } 
    end 
    end 
end 
end 

deal.rb

class Deal < ActiveRecord::Base 
    belongs_to :user  
    attr_accessible :title, :description, :days 
end 

回答

0

如果我理解正確的話,你可能會想創建一個:天日屬性(字符串可能比較容易),然後使用Radio Buttons(而不是複選框)來允許用戶只選擇其中一個選項。

你的看法會是這個樣子:

<div class="field"> 
    <%= f.label :day, "Choose the day:" %> 
    <%= f.radio_button :day, "monday", "tuesday", "wednesday" %> 
</div> 

或者,你可以使用一個select tag,像這樣:

<%= f.select_tag(:day, [['Monday', 'Monday'], ['Tuesday', 'Tuesday], ...]) %> 

上午我回答正確的問題?

編輯嗯。以前從未嘗試過。如果您希望用戶能夠選擇幾天,則可能最容易爲每天創建一堆attr_accessor變量,爲每個變量創建一個複選框,然後讓模型中的控制器或before_validate動作更新:模型(數組)中的days屬性將所有選中的日期添加到數組中。該模型方法的凌亂的版本將是這樣的:

attr_accessible :days, ... 
attr_accessor :monday, :tuesday, :wednesday... 

before_validation :update_days 

def update_days 
    day_array = [] 

    day_array << "Monday" if self.monday == true 
    day_array << "Tuesday" if self.tuesday == true 
    ... 

    self.update_attribute(:days, day_array) 
end 

,然後,在你看來,對於每一個臨時屬性不同的複選框:

<div class="field"> 
    <%= f.label :monday %> 
    <%= f.check_box :monday %> 
</div> 
<div class="field"> 
    <%= f.label :tuesday %> 
    <%= f.check_box :tuesday %> 
</div> 

你甚至可以創建application_helper一個天幫手這只是一組日期符號,因此您可以執行類似操作:

<% days_of_the_week.each do |day| %> 
    <div class="field"> 
     <%= f.label day %> 
     <%= f.check_box day %> 
    </div> 
<% end %> 

避免重複。

再次,不是最乾淨的方式,但我認爲這將工作,而不必除了將days屬性更改爲數組之外。

+0

我其實希望用戶檢查他們希望交易可用的天數。 (可能是一天或者幾天) – ChrisBedoya 2013-03-26 21:46:54

+0

是的,這就是我想要做的,但我想看看是否有更好的方法。非常感謝! – ChrisBedoya 2013-03-26 22:23:25

+0

是的。我期望有一個更好的方法,但我很難找到它。 – Sasha 2013-03-26 22:24:08

0

我認爲你的觀點大部分是正確的。我懷疑這個錯誤在你的控制器中。如果您可以發佈控制器的代碼,那可能會幫助我們識別問題,但我會提供一種可能的解決方案。

隨着你的代碼,Rails將解析字段到一個像params[:deal][:days]這樣的散列。該散列將包含表示日期的一組值。在做太多之前,我認爲你的代碼有錯誤。原型爲check_box功能

check_box(method, options = {}, checked_value = "1", unchecked_value = "0") 

您已經爲checked_valueunchecked_value提供相同的值。我們進行了修復,並更改爲

<%= f.check_box :days, {}, "tuesday", "" %> 

然後,我相信你的控制器將獲得的價值將看起來像

params[:deal][:days] == ['', 'Monday', 'Tuesday', '', '', 'Friday', ''] 

在控制器,你可以通過這個數組循環,並將其分配給您的模型。

deal.days.clear 
params[:deal][:days].each do |day| 
    deal.days << day if day.present? 
end 

我不能在此刻進行測試,所以把它當作僞代碼,希望能得到您在正確的方向前進。

+0

我用控制器更新了我的問題。我必須添加一些東西嗎? – ChrisBedoya 2013-03-26 23:31:44

相關問題