我的Rails应用程序中有一个表单元素,用于更改帖子的发布日期(不是时间)。我这样做了所以我可以使用jquery-ui中的一个datepicker元素,并且有时间下拉菜单。
我想将“updated_at”属性更新为发布日期。但是,我收到了一个错误:
PG::Error: ERROR: null value in column "updated_at" violates not-null constraint
: UPDATE "steps" SET "updated_at" = NULL WHERE "steps"."id" = 472
这是我的表格(可以正确节省时间而不是日期):
<%= semantic_form_for [@project, @step], :html => {:multipart => true} do |f| %>
<%= f.inputs do%>
<div id="publishedOn">
<span class="label" style="margin-left:9px">Published on</span>
<%= f.text_field :published_on, :value=> (@step.updated_at.strftime("%m/%d/%Y")) %> at <%= f.time_select :updated_at, :class=>"btn dropdown-toggle", :ampm=> true, :ignore_date=>true%>
</div>
<% end %>
steps_controller:
def update
@step = @project.steps.find_by_position(params[:id])
published = String(params[:published_on])
published = published.gsub("/", "-")
@step.update_attributes(:updated_at => published)
end
step.rb:
class Step < ActiveRecord::Base
extend FriendlyId
friendly_id :position
has_ancestry :orphan_strategy => :adopt
attr_accessible :description, :name, :position, :project_id, :images_attributes, :parent_id, :ancestry, :updated_at, :published_on
belongs_to :project
has_many :images, :dependent => :destroy
accepts_nested_attributes_for :images, :allow_destroy => :true
validates :name, :presence => true
end
我是否需要重新格式化published_on日期参数以更新updated_at日期?
答案 0 :(得分:0)
updated_at
模型属性并非真正用于任何目的,而是记录模型对象上次更新的时间。它可以被覆盖,但Rails练习并不好。您目击的错误可能是尝试覆盖核心属性的结果。
我过去实现的解决方案是创建一个单独的属性,可能类似于published_at
。您可以根据自己的喜好对此进行操作,同时保留updated_at
以达到其目的。
答案 1 :(得分:0)
在第
行@step.update_attributes(:updated_at => published)
Rails似乎在抱怨您尝试将update_at
更新为nil
。所以可能发生的是变量published
是零。
答案 2 :(得分:0)
您确实应该为发布日期使用新属性。您可以使用:updated_at属性,但每当您更新数据库中的条目时,它都将被覆盖。 如果你使用Rails,你知道它是一个非常自以为是的框架,所以坚持使用约定。除此之外,您不会在数据库中节省大量空间或进行优化。