2014-10-19 62 views
0

我試圖讓如果有人發表沒有標題的帖子,帖子會得到一個默認標題。如果params [:object] .nil? :object = value

我已經試過這到目前爲止

控制器

def create 
@post = Post.create(post_params) 
    if @post.title.nil? 
    @post.update(:title => 'Unnamed') 
    else 
    # DO NOTHING 
    end 
end 

控制器

def create 
    if params[:title].nil? 
    params[:title] == 'Unnamed' 
    @post = Post.create(post_params) 
    else 
    @post = Post.create(post_params) 
    end 
end 

但忽略了最低的工作。任何想法我做錯了什麼? 在此先感謝。

+0

空輸入值可能不'nil'。相反,它可能是一個空字符串'「」'。使用'PARAMS [:標題] .empty' – 2014-10-19 00:19:43

+1

這個題目可以是有趣:http://stackoverflow.com/questions/328525/how-can-i-set-default-values-in-activerecord – 2014-10-19 00:25:37

+0

我試過了,但我有一個錯誤。 「空?沒有定義」 – niiicolai 2014-10-19 00:25:49

回答

5

我我看來,這是該機型責任心,以保持自己處於有效狀態。此外,根據DRY原則,如果多個控制器更新相同型號的更新,這是最好的解決方案。因此,我會做的Post模型是這樣的:

before_validation :set_default_title 

private 
def set_default_title 
    self.title = title.presence || 'Unnamed' 
end 
+0

這就是我正在尋找的。非常感謝! – niiicolai 2014-10-19 00:40:05

1

看來你正在處理強參數,所以它不工作後permit所有屬性的默認設置標題爲params

def post_params 
    params[:post][:title] = "Unnamed" if params[:post][:title].blank? 
    #params.require(:post).permit(:title, ...) 
end 

Post.create(post_params) 

我也推薦使用blank?。這裏有blank?,empty?nil?之間的差異。

nil.nil? => true 
"".nil? => false 
" ".nil? => false 

nil.empty? => true 
"".empty? => true 
" ".empty? => false 

nil.blank? => true 
"".blank? => true 
" ".blank? => true 
0

據我所知,您不希望標題的默認值顯示在輸入字段中。 也許這個解決方案可以工作

def create 
    @post = Post.new(post_params) 
    @post.title = @post.title.presence || 'Unnamed' 

    if @post.save 
     redirect_to # ... 
    else 
     render :new 
    end 
    end 

或者在模型中before_validation過濾器可以做的工作。

相關問題