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

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

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

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

Ruby on Rails 4

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

配列

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

Q&A

2回答

7234閲覧

Rails のform_for で配列に格納した情報をEditする方法

Auc_fan

総合スコア17

Ruby on Rails

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

Ruby on Rails 4

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

配列

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

0グッド

0クリップ

投稿2015/11/10 09:47

編集2022/01/12 10:55

Rails2か月目の初心者です。基本的な部分が分かっていなかったらすみません。

###前提・実現したいこと
1.Railsでform_for を利用して、配列に情報をいれたい。
2.その情報を正しく編集したい。

###発生している問題・エラーメッセージ

■View

rails

1**Show** 2<p> 3 <strong>Content2:</strong> 4 <%# @campaign.content2.try(:) %> 5 <%# @campaign.content2 %> 6 <%= text_field_tag 'campaign[content2][]' %> 7</p> 8 9**new** 10<%= form_for(@campaign) do |f| %> 11 <div class="field"> 12 <%= f.label :title %><br> 13 <%= f.text_field :title %> 14 </div> 15 <div class="field"> 16 <%= f.label :content1 %><br> 17 <%= f.text_field :content1 %> 18 </div> 19 <div class="field"> 20 <%= f.label :content2 %><br> 21 <%= f.text_field :content2 ,{:name => name="campaign[content2][]" ,:multipart => true} %> 22 <%= f.text_field :content2 ,{:name => name="campaign[content2][]" ,:multipart => true} %> 23 </div> 24 <div class="actions"> 25 <%= f.submit %> 26 </div> 27<% end %>

■Controller

**create** def create @campaign = Campaign.new(campaign_params) respond_to do |format| if @campaign.save format.html { redirect_to @campaign, notice: 'Campaign was successfully created.' } format.json { render :show, status: :created, location: @campaign } else format.html { render :new } format.json { render json: @campaign.errors, status: :unprocessable_entity } end end end **Update** def update respond_to do |format| if @campaign.update(campaign_params) format.html { redirect_to @campaign, notice: 'Campaign was successfully updated.' } format.json { render :show, status: :ok, location: @campaign } else format.html { render :edit } format.json { render json: @campaign.errors, status: :unprocessable_entity } end end end **strong parameter** def campaign_params params.require(:campaign).permit(:title, :content1, :content2 => []) end

■model

**db** create_table "campaigns", force: :cascade do |t| t.string "title" t.string "content1" t.string "content2" t.datetime "created_at", null: false t.datetime "updated_at", null: false end **model** class Campaign < ActiveRecord::Base end

そして、入力すると、下記のようにContent2には、「”test","test"]となって、配列で受け取らたように一瞬思いますが、実は配列ではなく文字列でした。
( @campaign.content2として表示しています。そのためgsub等で、”や[等を削除する必要が出てきてしまいます。)

イメージ説明

ここからがさらに問題で、この情報を編集しようとすると、下記のようにContent2に入ってしまいます。

イメージ説明

どのようにすれば、content2を配列として、格納して、正常に取り出せ、正常にEditできるでしょうか。

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

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

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

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

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

guest

回答2

0

おそらく、miyamiyaさんのおっしゃる方法で、配列としてパラメータを渡すのは可能だと思います。
問題は、受け取り側のモデル要素content2がどうなっているかが問題なのではないかと。
content2が文字列を受け取るモデル(DB側がStringになっている)なんだとしたら、
自動的に配列は文字列として処理されてしまうのではないかと。

html

1<% @campaign.content2.each do |content| %> 2 <%= text_field_tag "campaign[content2][]", content %> 3<% end %> 4<%= text_field_tag "campaign[content2][]" %>

これで意図されたパラメータが渡されるはず
後は、コントローラ側で素直にパラメータで格納できないのであれば、
パラメータをループで回してしまうとか

Ruby

1if params[:campaign][:content2].present? 2 params[:campaign][:content2].each do |cont| 3 @compaign.content2 << cont 4 end 5end

showメソッドの方でも、配列はうまい事処理しないときちんと表示されないかと。

html

1<%= label_for :campaign, :content2 %><%= @campaign.content2.join(', ') %>

こんなところでしょうか。モデルの内容を教えて頂かないとこれ以上はアドバイスできません。

投稿2015/11/12 00:48

rifuch

総合スコア1901

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

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

Auc_fan

2015/11/12 04:35

有難うございます。不足していたモデルの情報を追記させて頂きました。加えて、Viewなども極力追記致しました。是非ともアドバイスの程宜しくお願いします。
rifuch

2015/11/12 11:01

モデル設計が良くないですねえ。 campaignのcontent2がStringなので、パラメータをそのまま渡せば、当然のように文字列で処理しようとします。ですから、パラメータをそのまま渡す今のやり方では、params[:campaign][:content2]を文字列として扱った状態が正しいので、例に挙げられた動きは仕様として正しい動きをしているといえます。 問題は、content2がどういうデータで、なぜ故に文字列で格納しているカラムを配列として扱いたいのか、です。 あくまでこのモデルのままで行くのであれば、content2を配列として扱うメソッドを用意して、before_filter等を使って文字列<->配列の変換を行って何とかするしかないでしょう。 モデル設計を変えるのであれば、content2を表すモデルを追加して、has_many関連をつけてあげればすっきりするでしょう。
Auc_fan

2015/11/16 01:59

有難うございます。もうすこし単純かと思っておりました、、、。
guest

0

おそらく、contents2は配列として受け取れているかと思います。
ただ、f.text_fieldがArrayを文字列としてすべて表示してしまうため、
表示の際に分けて表示する方法として、text_field_tagを使うのが良いかと思います。

ruby

1#example 2text_field_tag 'content2[]', @campaign.contents2.try(:first) 3text_field_tag 'content2[]', @campaign.contents2.try(:second)

見当違いだったらすみません。

投稿2015/11/10 15:37

miyamiya

総合スコア691

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

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

Auc_fan

2015/11/11 12:20

有り難うございます。残念ながらうまくできていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問