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

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

ただいまの
回答率

90.50%

  • Ruby on Rails

    7468questions

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

  • Ruby on Rails 4

    2455questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • 配列

    534questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • checkbox

    45questions

    checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

check_boxでモデルに配列で文字列を保存したい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,608

k.m.m.m

score 57

rails4でチェックボックスを使って同じモデルに配列で5個の文字列を保存したいのですがうまくできません。

作りたいものは、ユーザーがポストするときにそのポストに自分でタグ付けをできるようにすることです。

postモデルが親で、タグモデルが子の関係の関連付けをしました。

accepts_nested_attributes_forを使って作成しています。

post.rb

class Post < ActiveRecord::Base
  has_many :tags
  accepts_nested_attributes_for :tags
end

tag.rb

class Tag < ActiveRecord::Base
belongs_to :post
end

schemafileはこんな感じです。
タグモデルの中には、外部キーであるpost_idと、タグの種類を文字列で保存するためのstring型のcategoryカラムがあります。

create_table "tags", force: :cascade do |t|
 t.string  "category"
 t.integer "post_id"
end

postコントローラーにはtagモデルに関係する記述はストロングパラメーターのみです。

class PostsController < ApplicationController

private

def post_params
    params.require(:post).permit(:content, :image, tags_attributes: [:category])
  end


end

ビューです

<%= form_for @post do |f| %>
  <%= f.file_field :image, :id => 'post_post_img' %>
  <%= f.text_area :content %>
  <%= f.fields_for :tags, Tag.new do |tag| %>
   <label><%= tag.check_box_tag :category,{},'background' %>バックグラウンド</label>
   <label><%= tag.check_box :category,{},'translation' %>翻訳</label>
   <label><%= tag.check_box :category,{},'trivia' %>豆知識</label>
   <label><%= tag.check_box :category,{},'interpretation' %>解釈</label>
   <label><%= tag.check_box :category,{},'other' %>その他</label>
  <% end %>
<% end %>

こうすると、複数にチェックしても最後にチェックした値か、どれか一つにチェックした場合、0の値が送られてしまいます。

<%= form_for @post do |f| %>
  <%= f.file_field :image, :id => 'post_post_img' %>
  <%= f.text_area :content %>
  <%= f.fields_for :tags, Tag.new do |tag| %>
   <label><%= tag.check_box_tag :category,{},'background' %>バックグラウンド</label>
  <% end %>
  <%= f.submit %> 
<% end %>

このように、バックグラウンドのみのチェックボックスを表示させて送信すると、ちゃんとcategoryカラムにbackgroundが保存されます。

これをちゃんと配列でモデルに保存したいのですがどのようにやれば良いでしょうか?

最終的には、@post.tag.where(category:"background").present?みたいな感じで、値を取り出すのが目標です。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

check_box_tag 'post[category][]','選択肢' , 初期値


で実装してみてください。

追記

すみません。上の書き方だとコントローラー側でちょっと加工しないとダメでしたね。

check_box_tag 'post[tags_attributes][][category]','選択肢' , 初期値

で実装すれば行けると思います。いけない場合はパラメータのモデルへの渡し方が悪いので,binding.pryなどでparamsの中身を確認して,正しく整形したものをモデルに渡してください。

質問者様の意図している使い方をみる限りfields_forを使って書くのは難しそうです。

ちなみにうちのプロダクトでは,accepts_nested_attributes_forを使わない方法で開発サイクルを回しています。

accepts_nested_attributes_forを使わない理由はこちらをご覧ください。サービスの規模が小さければ問題ないですが,代替する方法としてはformを作成する方法が一般的かと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/26 18:30

    解答ありがとうございます。
    上記のコードで実装しましたができなかったです。

    キャンセル

  • 2016/04/26 20:49 編集

    送られてきたparamsの値配列になってませんでしたか?
    モデルの方あんまり見てなかったのですが定義不足してますね。
    時間空いた時追記します。

    キャンセル

  • 2016/04/27 18:10

    追記しました。

    キャンセル

  • 2016/04/27 19:05

    別のやり方で実装することにしました。
    解答してくださってありがとうございました。
    是非これからもよろしくお願いします。

    キャンセル

  • 2016/04/27 19:09

    追記してくださったのに本当に申し訳ないです。
    本当にごめんなさい。
    全部読んだのでまたの機会に解答してくださった知識を使って実装しようと思います。
    為になる解答してくださって本当にありがとうございました。

    キャンセル

  • 2016/04/27 19:12 編集

    シンプルに実装した感じですね。
    いえいえ忙しかったので,遅れてすみませんでした。
    ちなみに選択肢がtagsコントローラーごとに共通であればfields_forメソッドにmultipleオプションをつけてAction内でインスタンス作成する方法か動的に要素を追加したければajaxで実装できます。
    次回実装するときにでも参考になればと思います。

    キャンセル

  • 2016/05/01 18:44

    そうなんですね!
    貴重な情報ありがとうございます。
    そうやって実装できるのですね。
    ぜひ次回の実装ではajax使って実装してみたいと思います。
    ありがとうございます!

    キャンセル

0

一つのcategoryカラムに配列で値を送信するのをやめてboolean型でそれぞれのカラムを作って送信するように変更しました。

<%= form_for @post do |f| %>
  <%= f.file_field :image, :id => 'post_post_img' %>
  <%= f.text_area :content %>
  <%= f.fields_for :tags, Tag.new do |tag| %>
   <label><%= tag.check_box :background,{},'background' %>バックグラウンド</label>
   <label><%= tag.check_box :translation,{},'translation' %>翻訳</label>
   <label><%= tag.check_box :trivia,{},'trivia' %>豆知識</label>
   <label><%= tag.check_box :interpretation,{},'interpretation' %>解釈</label>
   <label><%= tag.check_box :other,{},'other' %>その他</label>
  <% end %>
<% end %>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    7468questions

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

  • Ruby on Rails 4

    2455questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • 配列

    534questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • checkbox

    45questions

    checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。