

現在、ポートフォリオの投稿機能にハッシュタグ機能を実装に挑戦しております。

# 不明点

投稿フォームには下記のように、記入するよう促す予定です。

「タグ(タグ同士の間には半角の `,` を入れてください)」 → （例）A,B,C

その時、ストロングパラメーターで送られてきた値は `params{tagname: "A,B,C"}` になっております。  
これをcreateメソッドで保存する際に、`.split(",")`
を用いて、１つずつタグ情報を保存したいです。しかし、記述方法がわかりません。コントローラー内の記述方でアドバイス頂きたく。

現在のコントローラーは、添付の通りです。  
今回はタグ機能実装に当たり、Formオブジェクトを使用しております。

[code]

    class PostsController < ApplicationController
      def new
        @post_form = PostForm.new
      end
    
      def create
        @post_form = PostForm.new(post_form_params)
        if @post_form.valid?
          @post_form.save
          redirect_to root_path
        else
          render :new
        end
      end
    
      def beautypage
        @beautypages = Post.where(genre: 1)
      end
    
      def troublepage
        @troublepages = Post.where(genre: 2)
      end
    
    
      private 
    
      def post_form_params
        params.require(:post_form).permit(:title, :genre, :detail, :tagname, images: []).merge(user_id: current_user.id)
      end
    end
    
[/code]

下記は投稿フォーム内容

[code]

    <%= form_with model: @post_form, url: url, method: method, id: 'new_post', local: true do |f|%>
      <div class="field">
        <%= f.label :title, "タイトル" %><br />
        <%= f.text_field :title, id:"post_title" %>
      </div>
    
      <div class="field">
        <%= f.label :images, "画像" %><br />
        <%= f.file_field :images, multiple: true, id:"post_image" %>
      </div>
    
      <div class="field">
        <%= f.label :genre, "投稿ジャンル" %><br />
        <%= f.select :genre, [["美容投稿", 1], ["お悩み投稿", 2]], include_blank: "選択して下さい", id:"post_genre" %>
      </div> 
    
      <div class="field">
        <%= f.label :detail, "投稿内容" %><br />
        <%= f.text_area :detail, class: :form__text, id:"post_detail" %>
      </div>
    
      <div class="field">
        <%= f.label :tagname, "タグ(タグ同士の間には半角の「,」を入れてください)", {class:"tag-label"} %><br />
        <%= f.text_field :tagname, placeholder: "（例）スキンケア,乾燥肌,肌荒れ", :class => "tag-field" %>
      </div>
    
    
      <div class="actions">
        <%= f.submit "投稿", class: :form__btn  %>
      </div>
    <% end %>
    
[/code]

下記Formオブジェクトの中身 → こちらで `,` を取り除いて保存するような記述にした方が好ましいですか？

[code]

    class PostForm
      include ActiveModel::Model
      attr_accessor :title, :images, :detail, :genre, :tagname, :user_id, :post_id, :tag_id
    
      with_options presence: true do
        validates :title, length: { maximum: 50 }
        validates :genre
        validates :detail
        validates :user_id
      end
    
      def save
        post = Post.create(title: title, genre: genre, detail: detail, user_id: user_id ,images: images)
      
        tag = Tag.where(tagname: tagname).first_or_initialize
        tag.save
        
        PostTag.create(post_id: post.id, tag_id: tag.id)
      end
    end
    
[/code]


CC BY-SA 4.0
2022-07-03T13:08:14.127
89740
2022-07-06T04:55:08.307
2022-07-06T04:55:08.307
3060
53182
question
ruby-on-rails ruby
タグ機能 ストロングパラメーターで送れてきたタグ情報の","を取って保存する方法


Form
Objectをせっかく使っているのでしたら、今回のようにパラメータを処理するときにはそこでやるのが望ましいでしょう。コントローラーは基本的には薄くするべきです。

コード的には、

[code]

    tagname.split(',').each do |name|
      tag = Tag.find_or_create_by(tagname: name)
      PostTag.create(post_id: post.id, tag_id: tag.id)
    end
    
[/code]

みたいな感じでしょうか。


CC BY-SA 4.0
2022-07-03T15:14:09.267
89743
2022-07-03T15:14:09.267
442
89740
answer