Rails 4:间歇性地执行条件更新操作

时间:2015-12-15 23:48:32

标签: ruby-on-rails ruby-on-rails-4 activerecord

在我的Rails 4应用程序中,我有以下模型:

class Post < ActiveRecord::Base
  has_one :metadatum
end

class Metadatum < ActiveRecord::Base
  belongs_to :post
end

以下是Metadatum模型的架构:

create_table "metadata", force: :cascade do |t|
  t.integer  "post_id"
  t.string   "title"
  t.text     "description"
  t.string   "host"
  t.string   "image"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
  t.string   "link"
end

create操作中,我执行以下操作以获取MetaInspector gem的数据,并将其存储在与Metadatum条右侧相关联的Post中:

def create
    [...]
    if @post.format == "Link"
      @metadatum = @post.build_metadatum
      @link = MetaInspector.new(facebook_copy_link(@post.copy)) unless facebook_copy_link(@post.copy).blank?
      if @link
        @metadatum.title = @link.title
        @metadatum.description = @link.meta_tags["name"]["description"].to_s.tr('[""]', '')
        @metadatum.host = @link.host
        @metadatum.image = @link.images.best
        @metadatum.save
      end
    end
    respond_to do |format|
      if @post.save
        [...]
      end
    end
  end

现在,我需要在编辑操作中实现类似的过程,考虑到我们有两种情况:

  1. 当前帖子:format未设置为&#34;链接&#34;在此edit之前,现在设置为&#34;链接&#34;,因此与Metadatum关联的Post记录为空。
  2. 当前Post格式已设置为&#34;链接&#34;在此edit之前,我们只需要updateMetadatum相关联的Post记录的属性。
  3. 基于这种推理,我在Posts#Update中实现了以下内容:

      def update
        [...]
          if @post.format == "Link"
            if @post.metadatum
              @metadatum = @post.metadatum
            else
              @metadatum = @post.build_metadatum
            end
            @link = MetaInspector.new(facebook_copy_link(@post.copy)) unless facebook_copy_link(@post.copy).blank?
            if @link
              @metadatum.update!(title: @link.title,
                                description: @link.meta_tags["name"]["description"].to_s.tr('[""]', ''),
                                host: @link.host,
                                image: @link.images.best)
            end
          end
          respond_to do |format|
            if @post.update(post_params)
              [...]
            end
          end
        end
      end
    

    这只是部分有效,我无法理解原因:

    • 让我说我在帖子中保存了链接A,将其更改为链接B并更新帖子,然后在控制台和帖子节目视图中都没有任何变化。
    • 但是,如果我再次尝试编辑相同的帖子,请保留链接B并更新帖子,然后在控制台和帖子显示视图中显示所有正确的数据。

    知道这里有什么问题以及如何解决它?

0 个答案:

没有答案