我正在尝试在 Rails 4 中制作一个应用程序。
我有一个名为 Finalise 的模型,它有两个属性。一个是名为 :draft 的 bool 值,另一个是名为 :finalized_at 的日期时间。 Finalize属于我的项目模型。项目已完成。
这个想法是用户创建新项目,但将它们存储为草稿,直到准备好发布为止。在我的项目显示页面中,我的显示页面上有一个链接,因此如果创建项目时 :draft 为 true,您可以单击该链接将其切换为 false。
当 :draft 变为 false 时,我想写:发布于 [插入 :draft 变为 false 的日期]。
我的目标是在我的项目页面上有一个链接,该链接仅对创建该项目的用户可见,并且仅在 :draft 为 true 时可见。该链接显示“最终确定草稿”,并且是将草稿属性切换为 false 的链接。每当草稿为 false 时(单击此链接时,或者如果创建了新项目但从未将其保存为草稿,因为从创建时起草稿 = false),则会显示该项目不再是草稿的日期给项目展示页面上的所有用户。
我想做的是编写一个方法,该方法知道如何捕获用户单击链接以使项目 :draft = false 的日期。目前,我已经一切正常,使用 Time.now 函数而不是 :draft 变为 false 的时间。
我的第一次尝试是:
在我的最终 Controller 中,我有:
def toggle_draft
@finalise = Finalise.find(params[:id])
@finalise.draft = false
@finalise.finalised = Time.now
@finalise.save
redirect_to project_path(Project.find(params[:projectid]))
end
在我的最终 View 中,我有:
<% if @project.finalise.draft == true %>
<%= link_to 'Finalise draft', finalise_toggle_draft_path(projectid: @project.id, id: @project.finalise.id, finalise_id: @project.finalise.id), method: :patch %>
<% end %>
<% if @project.scope.finalise.draft == false %>
<div class="datasubtextq">Published on <%= @project.scope.finalise.finalised.try(:strftime, '%d %B %Y') %></div>
<% end %>
然后我收到了下面的建议,尽管该用户现在表明它可能对此目的没有用处:
该建议涉及在我的 Finalises.rb 中包含一个方法,如下所示,并将我的 View 更改为:
<% if @project.scope.finalise.draft == false %>
<div class="datasubtextq">Published on <%= @project.scope.finalise.finalised_at.try(:strftime, '%d %B %Y') %></div>
<% end %>
在finalise.rb中
def set_finalised_if_published
if self.draft_changed? && !self.draft
self.finalised_at = Time.now
self.save
end
end
使用下面的建议,我将 Finalises_controller 修改为:
def toggle_draft
@finalise = Finalise.find(params[:id])
@finalise.draft = false
# @finalise.finalised = Time.now
@finalise.save
redirect_to project_path(@finalise.scope.project.id])
end
在我的routes.rb中,我有:
resources :finalises do
patch '/toggle-draft', to: 'finalises#toggle_draft', as: 'toggle_draft'
end
当我尝试此操作时,我收到一条错误消息:
No route matches {:action=>"toggle_draft", :controller=>"finalises", :id=>62} missing required keys: [:finalise_id]
我现在担心尝试各种建议会比我在开始这个帖子之前所做的更困惑。我现在收到一条错误消息“未定义的方法终结”。我没有称为 Finalise 的方法。我有一个名为 Finalise.rb 的模型
有谁知道如何编写一些东西来捕获 :draft 在数据库中变为 false 的日期?
谢谢
最佳答案
我认为您应该使用 ActiveRecord 回调,例如 after_save
。在这个回调中,您可以通过ActiveModel::Dirty模块提供的方法来观察模型的变化。
示例,在您的 Finalize
模型中:
after_save :set_finalized_if_published
def set_finalized_if_published
if self.draft_changed? && !self.draft
self.finalized = Time.now
self.save
end
end
关于jquery - Rails 4 - 在数据库中插入单击按钮的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30775600/