jquery - Rails 4 - 在数据库中插入单击按钮的日期

标签 jquery ruby-on-rails

我正在尝试在 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/

相关文章:

javascript - 退出 HTML5 和 Jquery Mobile 中的应用程序

ruby-on-rails - Rails 创建用户组

sql - ActiveRecord::Base.connection 和 find_by_sql 之间的区别

ruby-on-rails - 根据登录时的用户角色设计重定向到特定页面

javascript - 更新动态表格单元格跨度中的属性值 onclick

javascript - 如何使用切换按钮?

javascript - dataTable页长变化问题

javascript - jquery bootstrap datepicker仅月份和日期

css - rails 4 x SASS : load specific stylesheet in Internet Explorer

ruby-on-rails - Ruby/Rails 如何在 DateTime 范围内迭代月份?