2014-10-28 19 views
1

我遇到了質量分配和強參數的問題。在我的模型中,我有幾個屬性,這些屬性是通過我的mysql數據庫中的一列表示的。我也有一個領域,那不是。我只需要它來計算一個值。我不想將它存儲在我的數據庫中。Rails4沒有數據庫列的強參數

在我的控制,我定義的強參數:

def timeslots_params 
    params.require(:timeslot).permit(:employee_id, :dienstplan_id, :start_date, :start_time) 
    end 

但是當我試圖訪問START_TIME屬性在我的控制,我發現了

undefined method `start_time' for #<Timeslot:0x007fff2d5d8070> error. 

定義的其他帶有db列的參數存在並填充值。我是否錯誤理解強參數並且必須定義其他內容?

編輯:這裏是代碼,在那裏我稱之爲timeslots_params:

def create 
    @e = Timeslot.new(timeslots_params) 
    @e.start_date = @e.start_date.to_s + " " + @e.start_time.to_s 

    if @e.save 
     current_user.timeslots << @e 
     respond_to do |format| 
     format.json { render :json => @e } 
     end 
    end 
    end 
+0

你可以發佈'Timeslot'模型類的代碼和你在那裏定義'start_time'的地方嗎? – Surya 2014-10-28 17:33:29

+0

發佈您正在調用'timeslots_params'的行爲並獲取該錯誤。 – nikkon226 2014-10-28 18:24:28

+0

我已將代碼添加到我的第一篇文章中 – user39063 2014-10-28 18:39:19

回答

1

請,只允許你希望你的用戶數據發送PARAMS。如果START_TIME不是用戶數據更新您的數據庫,用這樣的方式:

params.require(:timeslot).permit(:employee_id, :dienstplan_id, :start_date) 

強參數防止保存數據用戶發送和你不希望他/她更新。

如果您使用:start_time,它必須在您的模型中定義。

行動,我看到您的更新:

@e.start_date = @e.start_date.to_s + " " + @e.start_time.to_s 

如果發送:START_TIME到一個時隙例如他們START_TIME必須時隙模型的方法。由rails定義,如果它是db字段,用attr_accesor或att_reader定義或由源模型上的def鍵定義。

如果不是@e.start_time觸發器undefined method 'start_time'

再次編輯:

現在,start_time是一個模型變量。確保將它發送到表單的方式與字段相同。默認情況下,我們使用f <%= f.text_field :the_field %>。只是不要忘記f。

現在您必須再次允許此字段,如果您遵循我的第一條建議。

+0

實際上,它不一定要在模型中包含在參數中。 – nikkon226 2014-10-28 18:22:48

+0

現在,我已經在我的模型中定義了'attr_accessor:start_time'。現在我沒有得到任何錯誤,但是start_time的值是零。我用pry檢查過它。但是該值在POST請求中設置。 – user39063 2014-10-28 19:13:43

+0

你希望如何設置這個值?用戶輸入數據,使用Time.now,使用函數或...? – 2014-10-28 19:19:08

2

在你的模型提供訪問start_time領域:

attr_accessor :start_time 

如果你只需要讀訪問:

attr_reader :start_time 
0

雖然Alireza的答案可以工作,但您也可以嘗試定義符合setter點擊你自己,然後你可以在保存前使用變量。

def start_time=(time) 

    # use variable time to do what you want with the model 

end