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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

解決済

2回答

714閲覧

fields_forで保存したデータが表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2018/02/16 14:50

いつもお世話になっております。

この度はfields_forにて送信した画像データが表示されない問題について質問させて頂きます。
画像はcarrierwaveを導入済みです。

createアクションの一部部分

respond_to do |format| if @twi.save && @picture.save format.html { redirect_to '/twis', notice: 'Twi was successfully created.' } format.json { render :show, status: :created, location: @twi } else format.html { render :new } format.json { render json: @twi.errors, status: :unprocessable_entity } end end

にて、
@pictureは無事saveされ redirect_to '/twis' によってページが遷移するのですが、
ターミナルを確認したところ、どうもこのsaveとページ遷移の間で問題が生じているみたいです・・・

以下問題のあるターミナルの処理コードを貼らせて頂きます。

Started POST "/twis" for 124.141.117.247 at 2018-02-16 14:18:31 +0000 Cannot render console from 124.141.117.247! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by TwisController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"uNwKcn8UbJbtM6WIX9jzU2SI/f5jmfF4f/sr5iXkt7V0JbBAcK+zfDu5qLcY9QQaPjLCcZGfXKMAJItar5w/Lw==", "picture"=>{"twiimage"=>"images-1.jpg", "twi_id"=>"", "user_id"=>""}, "twi"=>{"msg"=>"テスト", "user_id"=>"1"}, "commit"=>"投稿する"} Account Load (0.4ms) SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = ? ORDER BY "accounts"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] User Load (0.4ms) SELECT "users".* FROM "users" WHERE (account_id == 1) (0.1ms) begin transaction User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] SQL (0.4ms) INSERT INTO "twis" ("msg", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["msg", "テスト"], ["user_id", 1], ["created_at", "2018-02-16 14:18:31.741657"], ["updated_at", "2018-02-16 14:18:31.741657"]] (81.7ms) commit transaction (0.1ms) begin transaction SQL (0.6ms) INSERT INTO "pictures" ("created_at", "updated_at", "twiimage") VALUES (?, ?, ?) [["created_at", "2018-02-16 14:18:31.826876"], ["updated_at", "2018-02-16 14:18:31.826876"], ["twiimage", nil]] (14.0ms) commit transaction Redirected to https://work-space-wataru1202.c9users.io/twis

"picture"=>{"twiimage"=>"images-1.jpg" でtwiimageにデータが格納されているのですが、
最後の方に["twiimage", nil]] とtwiimageデータに対してnilが表示されています・・・

理由がさっぱりわからないのでわかる方おりましたらご教示お願いいたします。。

各モデル情報

Twiモデル msg:text user_id:integer has_many :picture belongs_to :user Pictureモデル twiimage:string user_id:integer twi_id:integer belongs_to :twi, optional: true mount_upload :twiimage,TwiimageUploader

入力フォーム

<%= form_with(model:twi, local: true) do |form| %> <table> <tr> <th>ユーザー名</th> <td><%= @user.name %></td> </tr> <%= fields_for @picture do |p| %> <tr> <th><%= p.label :画像 %></th> <td><%= p.file_field :twiimage %></td> </tr> <%= p.hidden_field :twi_id %> <%= p.hidden_field :user_id %> <% end %> <tr> <th><%= form.label :呟き %></th> <td><%= form.text_area :msg, cols:40,rows:3 %></td> </tr> <%= form.hidden_field :user_id %> <tr> <th></th><td><%= form.submit '投稿する' %></td> </tr> </table> <% end %>

newアクション

def new users = User.where 'account_id == ?', current_account.id if users[0] == nil then user = User.new user.account_id = current_account.id user.save users = User.where 'account_id == ?', current_account.id end @user = users[0] @twi = Twi.new @twi.user_id = @user.id @picture = Picture.new @picture.twi_id = @twi.id @picture.user_id = @twi.user_id end

createアクション

def create @twi = Twi.new(twi_params) @picture = Picture.new(picture_params) @user = User.where('account_id == ?',current_account.id)[0] respond_to do |format| if @twi.save && @picture.save format.html { redirect_to @twi, notice: 'Twi was successfully created.' } format.json { render :show, status: :created, location: @twi } else format.html { render :new } format.json { render json: @twi.errors, status: :unprocessable_entity } end end end def twi_params params.require(:twi).permit(:msg, :user_id) end def picture_params params.require(:picture).permit(:twiimage, :twi_id, :user_id) end

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

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

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

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

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

guest

回答2

0

ベストアンサー

newアクションにて、
@picture = Picture.new
ではなく
@picture = @twi.picture.build
にしたところ、無事データがPictureモデルのtwiimageに保存出来ました。

追記
Twi.rbにて以下も加筆しています。
has_many :picture, dependent: :destroy
accepts_nested_attributes_for :picture

投稿2018/02/22 14:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

create methodにて @user を作る下で binding.pry を仕込んで @picture の中身を覗いて見て下さい
twiimage が無いのが多分 nil になっている原因です

twiimage があるなら, 別要因です

それとわざわざ @user = User.where('account_id == ?',current_account.id)[0] 指定するぐらいなら @user = User.find(account_id: current_account.id) とした方が見やすいと思いますよ

投稿2018/02/16 15:27

orange-lion

総合スコア426

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

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

退会済みユーザー

退会済みユーザー

2018/02/16 17:13

orange-lionさん 大変お世話になっております・・・ binding.pry が初見だったのでアドバイス頂いてから以下のサイトを参考に試してみました。 http://ruby-rails.hatenadiary.com/entry/20141024/1414081224 5. pry-byebugでデバッグ の「ステップ実行」を行うとターミナルの挙動がおかしくなるのですが、@picture の中身を覗く...というのはこのやり方で間違っていないでしょうか...? 追記 @userの指定方法のご指摘ありがとうございます。 習ったテキスト(Ruby on Rails 超入門)にあったコードをそのまま流用しておりましたが、そちらの方が見やすいので訂正させて頂きます。
orange-lion

2018/02/16 18:24

stepが挙動おかしくなるのはよくあったりします binding.pryで指定した後に `@picture` と書いてエンターを押すとその中身 @picture インスタンスオブジェクトが見れます なので、その中に twiimage のプロパティがちゃんと保持しているのか見た方が良いです binding.pryはデバッグツールの一つなのでそれの使い方がややこしければ、一旦無視していただいても大丈夫です puts @picture でtwiimageにちゃんとデータが入っているかどうかが知りたいです
退会済みユーザー

退会済みユーザー

2018/02/17 01:25

お手数おかけして本当に申し訳ありません。 やはり挙動がおかしくなるので一先ず binding.pry は取り除かせて頂きました。 画像を表示させたいと思っていたindexアクションに @picture = Picture.all を記述し、rails c で pry(main)>を起動。 画像をフォーム送信した後 puts @picture で確認したところnillが返ってきました。 fields_forでtwiimageにきちんとデータが格納されていないということでしょうか・・・
退会済みユーザー

退会済みユーザー

2018/02/17 03:09

先日アドバイス頂き解決した問題に関して、 Picture.rbにてbelongs_to :twi, optional: true と追加したところ@picture.saveが機能し、redirect_to '/twis' が起動したとお伝えしましたが、 調べたところoptionalオプションのtrueは値がnilでも保存が可能になるようです。 やはりフォームの時点でうまくPictureモデルの方に送られていないのでしょうか・・・ 追記 ふと思った点について、Pictureモデルは画像の保存場所のみとしての機能でいいと思ったので、PicturesControllerは作成しておりません。 TwiControllerのcreateアクション及びfields_forでPictureモデルの方に保存されると考えているのですが、その点に問題はありますでしょうか...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問