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

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

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

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

checkbox

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

Ruby on Rails 4

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

配列

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

Q&A

2回答

5692閲覧

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

k.m.m.m

総合スコア77

Ruby on Rails

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

checkbox

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

Ruby on Rails 4

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

配列

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

0グッド

0クリップ

投稿2016/04/24 16:08

編集2016/04/24 16:11

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?みたいな感じで、値を取り出すのが目標です。

よろしくお願いします。

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

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

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

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

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

guest

回答2

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 %>

投稿2016/04/27 10:04

k.m.m.m

総合スコア77

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

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

0

ruby

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

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

追記

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

ruby

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

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

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

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

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

投稿2016/04/25 10:19

編集2016/04/27 09:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

k.m.m.m

2016/04/26 09:30

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

退会済みユーザー

2016/04/26 11:54 編集

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

退会済みユーザー

2016/04/27 09:10

追記しました。
k.m.m.m

2016/04/27 10:05

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

2016/04/27 10:09

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

退会済みユーザー

2016/04/27 10:20 編集

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

2016/05/01 09:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問