Jquery Rails 4-插入在db中单击按钮的日期

Jquery Rails 4-插入在db中单击按钮的日期,jquery,ruby-on-rails,Jquery,Ruby On Rails,我正在尝试在Rails 4中制作一个应用程序 我有一个名为Finalize的模型,它有两个属性。一个是名为:draft的布尔值,另一个是名为:finalized_at的日期时间。最终确定属于我的项目模型。项目有一个最终定稿 其思想是用户创建新项目,但将其存储为草稿,直到准备发布。在“我的项目显示”页面中,我的“显示”页面上有一个链接,以便在创建项目时,如果:draft为true,您可以单击该链接将其切换为false 当:draft变为false时,我想写:Published on[插入:draf

我正在尝试在Rails 4中制作一个应用程序

我有一个名为Finalize的模型,它有两个属性。一个是名为:draft的布尔值,另一个是名为:finalized_at的日期时间。最终确定属于我的项目模型。项目有一个最终定稿

其思想是用户创建新项目,但将其存储为草稿,直到准备发布。在“我的项目显示”页面中,我的“显示”页面上有一个链接,以便在创建项目时,如果:draft为true,您可以单击该链接将其切换为false

当:draft变为false时,我想写:Published on[插入:draft变为false的日期]

我的目标是在我的项目页面上有一个链接,该链接仅对创建项目的用户可见,并且只有在以下情况下:草稿为真。该链接显示“定稿”,是一个将草稿属性切换为false的链接。每当草稿为false时(单击此链接时,或者如果创建了新项目,并且由于从创建时起草稿=false而从未保存为草稿),则项目停止为草稿的日期将显示在“项目显示”页面上,供所有用户使用

我想做的是编写一个方法,知道如何捕捉用户单击链接以使项目生效的日期:draft=false。现在,我已经把所有的功能都用Time.now函数代替了:draft变为false的时间

我的第一次尝试是:

在我的最终控制器中,我有:

  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
在我的最终意见中,我有:

<% 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 %>
根据以下建议,我将Finalizes\u控制器修改为:

 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
在my 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]
我现在担心尝试各种各样的建议会造成比我在开始这篇文章之前所做的更大的混乱。我现在得到一个错误,说“undefined method finalize”。我没有一个叫做finalize的方法。我有一个叫finalize.rb的模型

def set_finalised_if_published
    if self.draft_changed? && !self.draft
      self.finalised_at = Time.now
      self.save
    end
  end
有人知道如何写一些东西来捕捉:draft在db中等于false的日期吗


谢谢

我认为您应该使用ActiveRecord回调,比如保存后的
。在这个回调中,您可以使用模块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

密钥将在事件提交到数据库之后和更新之前拦截该事件。处理此问题的一种方法是使用您编写的当前toggle_draft方法,并向模型中添加一个方法:

最终确定控制器

def toggle_draft
  @finalise = Finalise.find(params[:finalise_id])
  @finalise.draft = false

  if @finalise.save
    redirect_to project_path(@finalise.project), notice: 'Successfully Updated'
  else
    redirect_to project_path(@finalise.project), alert: 'Not Updated'
  end
end
然后在finalize.rb模型文件中添加以下内容:

after_validation :set_publish_time
def set_publish_time
  self.finalised = Time.now  unless self.draft
end
如果你有任何问题,请告诉我

对于您的路由问题,请尝试将您的路由保留到:

resources :finalises do
    patch 'toggle-draft', to: 'finalises#toggle_draft', as: :toggle_draft
end
因此,路线将是:

finalise_toggle_draft_path(@project.finalise)
并确保在创建项目记录时创建Finalize记录,以便在将变量加载到路径中时,id不会返回nil

Product.rb型号

after_create :create_a_finalise
def create_a_finalise
    self.finalise.create draft: true
end
其他选择:

如果使用此选项,请不要在创建代码后使用上述选项

将其放入产品中#创建适合的动作

例如,您可以在表单中包含一个名为“final_draft”的额外参数复选框,该复选框不在您的数据库中,也不允许通过强参数来确定是否需要草稿:

def create
  @product = Product.new product_params

  if @product.save
    # if the checkbox is checked make the draft value false
    boolean = params[:product][:final_draft] == 1 ? false : true
    @product.create_a_finalise_dynamic boolean
    redirect_to projects_path, notice: 'Created!'
  else
    render :new
  end
end

首先,您的
切换\u draft
方法不会切换。它只出版。您可能应该将该方法重命名为
publish
。其次,我不认为简单地记录时间有什么错。现在,在你的发布方法中。我不确定你想要实现什么,但是你还没有实现。Jon,我不理解关于toggle_draft方法的评论。我想要一个切换,以便:草稿切换为假链接时,点击。我不认为给它一个不同的标签会改变我试图做的事情的实质。其次,Time.now记录时间.now。我想知道草稿被切换为false的时间,这样我就可以在其他地方使用它了。
toggle
的概念是一种方法,它在执行时会在两种不同的状态之间改变对象或变量的状态。如果为true,则设置为false;如果为false,则设置为true。但是,您的方法仅将某些内容设置为false。如果它已经为false,并且您切换它,那么它不应该继续为false。其次,
Time。现在在调用方法时对
进行求值。因此,这将是草稿设置为false的时间。我仅在属性设置为true时显示链接。如果为false,则不显示链接,也没有可切换的内容。关于time.now,我想用它来显示应用切换的时间,这适用于应用了切换方法的情况,但不适用于:draft属性未设置为true(以便切换)的情况。在这种情况下,我想写一些与日期相等的东西:draft变为false,可能是created_at date。是的-听起来你应该使用
created_at
date。顺便说一句,我认为为了遵循Rails惯例,你应该将属性命名为
finalized_at
。有了
定稿
,我们希望它是一个布尔值。嗨-这个选项看起来很合理。我试试看。什么是ActiveModel::Dirty?做self.draft的意思是“the:draft属性不正确?”另外,您在哪里找到这些约定?某处有它们的列表吗?这是否意味着我不需要控制器方法?我是否需要我的视图中的其他内容(将属性名称更改为:finalized_at)在上面的主体中列出。当我尝试此操作时,我得到一个错误,上面显示:未定义的局部变量或方法“set_finalized_at_if_published”。我已经在最终确定的模型中插入了该方法。最终确定属于范围,而范围又属于
def create_a_finalise_dynamic(boolean)
    self.finalise.create draft: boolean
end
def create
  @product = Product.new product_params

  if @product.save
    # if the checkbox is checked make the draft value false
    boolean = params[:product][:final_draft] == 1 ? false : true
    @product.create_a_finalise_dynamic boolean
    redirect_to projects_path, notice: 'Created!'
  else
    render :new
  end
end