如果params [:object] .nil? :object = value

时间:2014-10-19 00:15:25

标签: ruby-on-rails ruby ruby-on-rails-4

我试图这样做,如果有人发帖没有标题,帖子将获得默认标题。

到目前为止我已尝试过这个

控制器

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

但它没有工作。什么想法我做错了什么? 提前谢谢。

3 个答案:

答案 0 :(得分:5)

我认为这是模型的责任,使自己保持有效状态。此外,如果多个控制器更新同一模型,则根据DRY原则,它是最佳解决方案。因此,我会在Post模型中执行类似的操作:

before_validation :set_default_title

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

答案 1 :(得分:1)

您似乎正在处理强参数,因此在params所有属性之后将默认标题设置为permit无效。

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

答案 2 :(得分: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过滤器可以完成这项工作。