複数タグの実装を行なっています。
下書き保存の機能も実装しているため、
投稿で「公開」ではなく「下書き保存」を選択した場合に、
タグの保存の作業は行わない。公開の時のみ、タグの保存を行うということをしたいです。
「下書き」を選択し、投稿するとタグは保存されないという部分は問題なく動くのですが、
「公開」を選択し、タグを入力して投稿を押すと、おかしな動きをします。
具体的には、(/posts/new)で全て入力して投稿ボタン押す→(/posts)に行ってしまい、
投稿画面のまま(タイトル、投稿内容は保時されてるがタグの入力欄は空にされている)
→そこでもう一度タグを入力すると投稿完了し(posts/5)の投稿詳細ページに遷移する。
※本当の/postsは、投稿一覧画面です。
再読み込み?すれば投稿できることから、コントローラーでの記述の順番がおかしいのかな..と思い、
if文の順番を変えてみたりしましたが、うまく行きませんでした。
どのように記述を直せば良いのか教えていただきたいです。
posts_controller.rbの記述 def create @post = Post.new(post_params) @post.user_id = current_user.id # 受け取った値を,で区切って配列にする # @postオブジェクトを参照してタグの名前取得 # もし公開記事だったら、 if @post.save && params[:post][:status]=="true" tag_list = params[:post][:name].split(',') @post.save_tag(tag_list) redirect_to post_path(@post), notice: '投稿完了しました:)' elsif @post.save && params[:post][:status]=="false" redirect_to post_path(@post), notice: '下書きに登録しました。' else render :new end end def post_params params.require(:post).permit(:title, :content, :status) end
@post.save && (params[:post][:status]=="true")や、trueの””をとっても、
特に変わりありませんでした。
post.rbの記述 def save_tag(sent_tags) # タグが存在していれば、タグの名前を配列として全て取得 current_tags = tags.pluck(:name) unless tags.nil? # 現在取得したタグから送られてきたタグを除いてoldtagとする old_tags = current_tags - sent_tags # 送信されてきたタグから現在存在するタグを除いたタグをnewとする new_tags = sent_tags - current_tags # 古いタグを消す old_tags.each do |old| tags.delete Tag.find_by(name: old) end # 新しいタグを保存 new_tags.each do |new| new_post_tag = Tag.find_or_create_by(name: new) post_tags.new(user_id: user_id,tag_id: new_post_tag.id).save end end
投稿の新規登録 <%= form_with(model: post, local: true) do |f| %> 省略 <div class="field"> <!--%= f.hidden_field :user_id, :value => current_user.id %>--> <%= f.label"タグ (,で区切ると複数タグ登録できます)" %> <%= f.text_field :name,class:"form-control"%> <p>※下書き保存では、タグの情報は保存されません。</p> </div> <div class="form-group row"> <%=f.label:"公開範囲",class:"col-sm-4"%> <div style="padding-right:20px;"> <%= f.radio_button :status, "公開",checked: true %> <%= f.label :status, "公開", {value: :true, style: "display: inline-block;"} %></div> <div style="padding-right:20px;"> <%= f.radio_button :status, :false %> <%= f.label :status, "下書き保存", {value: :false, style: "display: inline-block;"} %></div> </div>
回答1件
あなたの回答
tips
プレビュー