我正在尝试在Rails 4中制作一个应用程序。
我有一个名为finalise的模型,该模型具有两个属性。一个是称为:draft的布尔值,另一个是称为:finalised_at的日期时间。最终确定属于我的项目模型。项目has_one定案。
这个想法是用户创建新项目,但将它们存储为草稿,直到准备发布为止。在我的项目显示页面上,我的显示页面上有一个链接,因此,如果在创建项目时:draft为true,则可以单击链接将其切换为false。
当:draft变为false时,我要写:发表于[插入:draft变为false的日期]。
我的目标是在我的项目页面上有一个链接,该链接仅对创建项目的用户可见,并且仅在:draft为true时可见。该链接显示为“最终草稿”,并且是一个链接,可将草稿属性切换为false。每当草稿为假时(单击此链接时,或者如果创建了新项目并且从创建时起草稿= false便从未将其保存为草稿),则显示该项目停止为草稿的日期给项目显示页面上的所有用户。
我想做的是编写一种方法,该方法知道如何捕获用户单击链接以创建项目的日期:draft = false。目前,我已经使用Time.now函数完成了所有工作,而不是:draft变为假的时间。
我的第一次尝试是:
在我的finalize控制器中,我有:
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 %>
然后,我在下面收到了一个建议,尽管该用户现在建议它可能对此没有用:
该建议涉及在我的finalises.rb中包含一个方法,如下所示,并将我的观点更改为:
<% 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]
我现在担心,尝试各种建议所带来的混乱会比我开始该线程之前所进行的混乱更大。我现在收到一条错误消息,提示“未定义的方法完成”。我没有一种称为finalize的方法。我有一个名为finalise.rb的模型
有谁知道如何写一些东西来捕捉:draft在数据库中等于false的日期?
谢谢
最佳答案
在将事件提交到数据库之后且在更新之前,密钥将拦截该事件。解决此问题的一种方法是使用当前编写的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
然后在您的finalise.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)
并确保在创建项目记录时创建了最终记录,因此在将变量加载到路径中时,它不会为id返回nil。
即
Product.rb模型
after_create :create_a_finalise
def create_a_finalise
self.finalise.create draft: true
end
其他选择:
如果使用此选项,请不要使用上面的after_create代码
def create_a_finalise_dynamic(boolean)
self.finalise.create draft: boolean
end
将其放入product#create操作中,但适合。
例如,您可以在表格中添加一个名为“ 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
关于jquery - Rails 4-在数据库中单击按钮的插入日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30775600/