我试图这样做,如果有人发帖没有标题,帖子将获得默认标题。
到目前为止我已尝试过这个
控制器
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 :(得分: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过滤器可以完成这项工作。