1

我在文章中有一个名为 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
  ........

在所有其他模型中都没有,包括主题的文章模型。

4

0 回答 0