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

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

ただいまの
回答率

90.40%

  • Ruby on Rails

    7916questions

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

  • Ruby on Rails 4

    2487questions

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

  • Ruby on Rails 5

    2414questions

fields_forでうまくデータが保存されません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 628

wakaba00

score 5

Rails初心者です。
動作がうまくいかず悩み続けています・・・どうかご助力下さい...

form_withとfields_forを用いてメッセージと画像を別のモデルに保存して表示したいと思っています。
画像はcarrierwaveを導入済みです。

各モデル情報

Twiモデル
msg:text  user_id:integer

has_many :picture
belongs_to :user


Pictureモデル
twiimage:string  user_id:integer  twi_id:integer

belongs_to :twi
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

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

上記コードの中の
@twi.save && @picture.save にて@pictureがsaveされずロールバックが発生してしまいます。
msgの方は問題なく保存されるため表示も可能です。

fields_forでうまく送信出来ていないのでしょうか・・・
どなたかわかる方、何卒よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

以前似た内容の質問をしたものに解答してくださった方がいました。
その方の解答が以下になります。

def create
  @twi = Twi.new(twi_params)
  @picture = Picture.new
  @user = User.where('account_id == ?',current_account.id)[0]

  respond_to do |format|
    begin
      @twi.save!
      @picture.save!
    rescue ActiveRecord::InvalidError => e
      binding.pry
    end
    #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


でエラーを補足し、binding.pry に捕まらない場合は rescue ActiveRecord::InvalidError => e の部分を

rescue => e
  binding.pry
end


にしてStandardErrorを捕捉してエラーの内容を把握する

とのことでした。
試したところ、エラーメッセージに

Validation failed: Twi must exist

と表示されたので、モデルに optional: true を追記したところ

class Picture < ApplicationRecord
belongs_to :twi, optional: true

mount_uploader :twiimage, TwiimageUploader
end

無事@twi.save && @picture.saveにて
@twi、@pictureともにsaveされレンダリングされました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/16 22:26

    あ、こちらにもあったんですか

    キャンセル

  • 2018/02/16 22:31

    すみません、teratailの仕様がまだイマイチ理解出来ておらず、似たような質問を2度投稿してしまいました・・・

    キャンセル

  • 2018/02/16 22:39

    まぁ埋もれてしまった質問を再度上げる、というのは中々難しいので。
    (自分もテラテイルの使いづらいUIからどうやって上げるのか理解できてないので)

    キャンセル

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

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

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

  • Ruby on Rails

    7916questions

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

  • Ruby on Rails 4

    2487questions

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

  • Ruby on Rails 5

    2414questions