2010-11-07 96 views
0

我對Rails有點新,而且我有一個簡單的應用程序和一些故事。我想讓這個功能輕鬆地隱藏我現在不想出現的故事。其他功能設置相同的方式工作正常,除了這一個布爾值。Rails將不會保存布爾值「隱藏」的值,但會保存其他值

def hide 
    @story = Story.find(params[:id]) 
    @story.hidden = true 

    if @story.save 
     redirect_to :controller => 'pages', :action => 'home' 
    else 
     redirect_to :controller => 'stories', :action => 'show', :id => @story.id 
    end 
    end 

因爲當此功能運行時,它不會更新故事的「隱藏」屬性,但@ story.save返回true(它的if語句的第一部分)的一些原因。我是否做了錯誤的設置@ story.hidden = true?我正在使用sqlite,如果這很重要。謝謝!

回答

0

如果這將只是總是更新布爾屬性爲true,那麼你可以做這樣的:

def hide 
    @story = Story.find(params[:id]) 
    @story.update_attribute(:hidden, true) 
    redirect_to :controller => 'pages', :action => 'home' 
end 
+0

這會繞過記錄上的驗證。由於OP是Rails的新手,我認爲不建議這樣做,除非您爲這種方法提供了缺陷。 – 2010-11-07 00:36:33

+0

這是一個很好的觀點,但是對於他們正在努力完成的任務而言,它並沒有失去任何功能,並且正在使用靜態硬編碼來更新布爾值 – s84 2010-11-07 00:43:34

0

嗯,首先,你爲什麼要使用一個自定義操作?這應該進入控制器中的更新操作,並且應該通過表單傳遞布爾值。現在

,爲您的具體問題,檢查@story變量修改的對象,但是這樣做:

logger.debug @story.changed? 

如果返回true,這意味着該記錄應更新,你應該查看日誌以確定UPDATE語句的真實含義。你應該把它放回這裏。

0

使用update_attributes!:它不會跳過驗證,並會拋出錯誤的異常。
也考慮使用rescue,因爲Story.find()以及update_attributes!可能會失敗。

def hide 
    @story = Story.find(params[:id]).update_attributes!(:hidden => true) 
    redirect_to :controller => 'pages', :action => 'home' 
end