【问题标题】:If params[:object].nil? :object = value如果 params[:object].nil? :对象=值
【发布时间】:2014-12-14 06:28:48
【问题描述】:

我正在尝试这样,如果有人发布没有标题的帖子,该帖子将获得默认标题。

到目前为止我已经尝试过了

控制器

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

但它不起作用。任何想法我做错了什么? 提前致谢。

【问题讨论】:

  • 空输入值可能不是nil。相反,它可能是一个空字符串""。使用params[:title].empty?
  • 这个主题可能很有趣:stackoverflow.com/questions/328525/…
  • 我试过了,但我得到了一个错误。 “空?未定义”

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


【解决方案1】:

我认为保持自己处于有效状态是模型的责任。此外,如果多个控制器更改更新相同的模型,这是根据DRY 原则的最佳解决方案。因此我会在Post 模型中做这样的事情:

before_validation :set_default_title

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

【讨论】:

  • 这正是我要找的。非常感谢!
【解决方案2】:

我了解您不希望在输入字段中显示标题的默认值。 也许这个解决方案可以工作

  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 过滤器可以完成这项工作。

【讨论】:

    【解决方案3】:

    您似乎正在处理强参数,因此在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多