我在文章中有一个名为 merge_with(other_article_id) 的模型实例方法:
def merge_with(other_article_id)
self.comments << Article.find(other_article_id).comments
self.body_and_extended << Article.find(other_article_id).body_and_extended
return self
end
在我的控制器中,我已合并定义:
def merge #ypw
@article = Article.find(params[:id])
unless @article.access_by? current_user
redirect_to :action => 'index'
flash[:error] = _("Error, you are not allowed to perform this action")
return
end
if params[:merge_with] and params[:merge_with] != ""
@article = @article.merge_with(params[:merge_with])
debugger
if @article.save
debugger
destroy_the_draft unless @article.draft
set_the_flash
redirect_to :action => 'index'
return
end
end
flash[:error] = 'merge articles did not succeed!'
redirect_to :action => 'index'
end
问题:在第一个调试器断点之前,我检查了@article.body,显示它已经将两篇文章的正文“A”和“B”完美地合并为一个“AB”。但是在第二个调试器断点处继续运行@article.save(@article.save 确实返回True 以允许进入if 语句)后,我发现实际上只有原始文章被保存,即@article.body = =“一个”。谁能帮我理解发生了什么?为什么@article.save 后,更新后的@article.body 内容又变回了更新前的原始内容?
非常感谢你的帮助。
嗨,Yoshiji 先生,感谢您的建议。我都试过了:保存和保存!
debugger
#if @article.save
if @article.merge_with(params[:merge_with]).save!
debugger
destroy_the_draft unless @article.draft
set_the_flash
redirect_to :action => 'index'
return
end
没有引发错误。正如您在第二个调试器断点处所预期的那样,我检查了@article.body,现在确实显示了“AB”。但是当它通过redirect_to :action => 'index' 运行回到文章列表页面时,如果我点击合并文章的链接,那么在编辑器中,它仍然显示“A”,只有“B”消失了。在旧内容再次保存之间是否有可能?
嗨 phoet,是的,当我在 rails 控制台中运行时(实际上我在 rails server --debug 中)并且 merge_with 行为符合预期。事实上,<< comments 和 << body 这两个行为都被检查过了,但有趣的是,将其插入代码后,只有 << comments 部分存活,<< body 部分丢失了!?神秘地重定向到之后.....
---关于这个谜的更多信息----- 请查看在 rails server --debug 控制台中以交互方式输入命令。请在保存后立即查看 Article.find(33).body 内容中“32”的神奇/神秘消失(但仍存在于@article.body 内容中)......任何合理的解释?谢谢。
(rdb:65) @article.body
"<p>\r\n\t33</p>\r\n<p>\r\n\t32</p>\r\n"
(rdb:65) Article.find(33).body << Article.find(32).body
"<p>\r\n\t33</p>\r\n<p>\r\n\t32</p>\r\n"
(rdb:65) Article.find(33).body
"<p>\r\n\t33</p>\r\n<p>\r\n\t32</p>\r\n"
(rdb:65) Article.find(33).save
true
(rdb:65) Article.find(33).body
"<p>\r\n\t33</p>\r\n"
(rdb:65) @article.body
"<p>\r\n\t33</p>\r\n<p>\r\n\t32</p>\r\n"
(rdb:65) @article.id
33
(rdb:65) Article.find(33).body
"<p>\r\n\t33</p>\r\n"
(rdb:65) @article.save!
true
(rdb:65) @article.body
"<p>\r\n\t33</p>\r\n<p>\r\n\t32</p>\r\n"
(rdb:65) Article.find(33).body
"<p>\r\n\t33</p>\r\n"
(rdb:65) Article.find(32).body
"<p>\r\n\t32</p>\r\n"
(rdb:65) Article.find(33).body << Article.find(32).body
"<p>\r\n\t33</p>\r\n<p>\r\n\t32</p>\r\n"
(rdb:65) Article.find(33).save
true
(rdb:65) Article.find(33).body
"<p>\r\n\t33</p>\r\n"
(rdb:65) @article.body
"<p>\r\n\t33</p>\r\n<p>\r\n\t32</p>\r\n"
(rdb:65)
嗨,Doug,所以 attr_accessible 的唯一一行是在 traceback.rb 中(实际上这是来自 Typo 博客开源)
require_dependency 'spam_protection'
class Trackback < Feedback
belongs_to :article
content_fields :excerpt
validates_presence_of :title, :excerpt, :url
attr_accessible :url, :blog_name, :title, :excerpt, :ip, :published, :article_id
........
在所有其他模型中都没有,包括主题的文章模型。