1

マークダウン ブログを書いており、フロント マターを使用して投稿タイトルなどのメタデータを定義したいと考えています。このフロント マターはマークダウン フィールドの一部であり、コントローラーの create アクションで解析されます。私が直面している問題は、コントローラーが変更された属性の保存を拒否することです。これを before_actions を使用してモデル メソッドに移動しようとしましたが、機能しませんでした。私もこの質問を読んattribute_will_change!で、私のモデルでこの方法を試しましたが成功しませんでした。私はアイデアが不足しているので、どんな助けもいただければ幸いです。

  • 何らかの理由で、public属性期待どおりに保存されますが、残りは保存されません。
  • fm変数に値が含まれていることを確認しました(問題なく動作します)
  • これをモデル before_save アクションに移動しようとしました
  • また、を削除して通常の割り当て||=に置き換えてみました。=

ポストコントローラーの作成

def create
    @post = Post.new(post_params)
    @post.public = true
    @post.user = User.first
    @post.word_count = @post.markdown.scan(/[\w-]+/).size
    fm, content = YAML::FrontMatter.extract(@post.markdown)

    @post.title_will_change!
    @post.title ||= fm[:title].to_s
    @post.subtitle ||= fm[:subtitle]
    @post.abstract ||= fm[:abstract]
    @post.video_token ||= fm[:video_token]
    @post.slug ||= fm[:slug]
    @post.seo_keywords = fm[:seo_keywords]

    if @post.image
        @post.image_id = fm[:image]
    end

    cat = Category.find_by_name(fm[:category])
    if cat.present?
        @post.category = cat
    else
        @post.category = Category.create(name: fm[:category])
    end

    new_markdown = @post.markdown.gsub(/(---\n(?:.*: '.*'\n)*---)/, '')
    @post.markdown = new_markdown
    respond_to do |format|
        if @post.save
            format.html { redirect_to @post, notice: 'Post was successfully created.' }
            format.json { render :show, status: :created, locataion: @post }
        else
            format.html { render :new }
            format.json { render json: @post.errors, status: :unprocessable_entity }
        end
    end
end
4

1 に答える 1