質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

633閲覧

「公開」の時のみ複数タグの保存を行う条件分岐をしたところ投稿の新規登録が出来なくなった。 ruby on rails

kiiiiiii

総合スコア1

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/08/14 06:11

編集2021/08/15 02:14

複数タグの実装を行なっています。
下書き保存の機能も実装しているため、
投稿で「公開」ではなく「下書き保存」を選択した場合に、
タグの保存の作業は行わない。公開の時のみ、タグの保存を行うということをしたいです。

「下書き」を選択し、投稿するとタグは保存されないという部分は問題なく動くのですが、
「公開」を選択し、タグを入力して投稿を押すと、おかしな動きをします。
具体的には、(/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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2021/08/15 12:25

`params[:post][:status]` の値ですが、本当に 文字列の "true"、"false" ですか? logで確認していただけますか
kiiiiiii

2021/08/15 12:40

ありがとうございます。 そこでした・・・。booleanでtrue falseでやってると勘違いしてましたが、実際受け取ってるのは、公開と下書き保存でした。
kiiiiiii

2021/08/15 13:05

お手数おかけしました。全て解決しました!!
guest

回答1

0

自己解決

booleanでtrue falseでやってると勘違いしてましたが、実際受け取ってるのは、公開と下書き保存でした。

投稿2021/08/15 13:36

kiiiiiii

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問