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

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

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

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

Q&A

解決済

2回答

4080閲覧

railsでnil:NilClassの解決方法

f-otake

総合スコア8

Ruby on Rails 4

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

0グッド

0クリップ

投稿2014/12/27 02:29

Rails: Rails 4.2.0.beta2
controller(一部抜粋)
def create
file = params[:doc][:file]
fname=file.original_filename
@doc = Doc.new(doc_params)
...
end
これはファイルと詳細の登録画面から来るものです。view(new.html.erb)には種々の項目とファイルの選択画面があります。
ここで、ファイルを選び登録をすると問題ないのですが、その際、ファイルの選択を忘れてしまうと、当然
fname=file.original_filenameのところでnil:NilClassになりますが、
ここでそのエラーを捕捉して、登録画面に戻したいのですが、その方法が解りません。
どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

自己解決

早速ありがとうございます。Object#presence メソッドがあるようですので、それを使おうと思いましたが、begin-rescure-endを知りましたので、controllerを(一抜粋)
def create
file = params[:doc][:file]
begin
fname=file.original_filename
rescue => ex
puts ex.message
render :new, @doc = params[:doc][:file], errors: 'ファイルが選択されていません!'
end
@doc = Doc.new(doc_params)
...
end
に変更しましたら、ファイルを選択しないとrender :new, ... のところで
wrong number of arguments (3 for 0..2)
になります。パラメーターが多いと言っているようですが???
初歩的な質問で申し訳ありませんがよろしくお願いします。

投稿2014/12/27 05:00

f-otake

総合スコア8

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

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

hello-world

2014/12/27 11:28

単純に @doc = params[:doc][:file] render :new, errors: 'ファイルが選択されていません!' だと思います。 それはそうと、そのコードですと renderした後に続きが実行されていまうので def create  file = params[:doc][:file]  if file.present?   # 作る  else   # 見つからないよ  end end というコードでないとよろしくないと思います。
f-otake

2014/12/27 14:06

ありがとうございます。controllerを下記にしましたが、 def create file = params[:doc][:file] if file.present? 作る作業 else @doc = params[:doc][:file] render :new, errors: 'ファイルが選択されていません!' end end しかし、render後、new.html.erbに行き、そこで form_for @doc, ... の所で First argument in form cannot contain nil or be emptyと言うエラーが出ています。 このFirst argumentって@docの事ですよね? このエラーの対処方法が解りません。お手数をお掛けしますがよろしくお願い致します。
katoy

2014/12/27 14:19

create メソッドは次のような形式にすれば良いと思います。 (beign の中身は、scaffold で生成されてコードや、エラーのことを考慮する前のコードで十分です。) def create begin ... respond_to do |format| ... } rescue => ex render ... // エラーメッセージ + ファイル指定画面 end end
f-otake

2014/12/27 14:47

下記のように変更しました def create file = params[:doc][:file] begin 作る作業 rescue => ex render :new, errors: 'ファイルが選択されていません!' end end としましたが、同じ状態のエラーが出ています。 また、@docにはそれまでに入力されたファイルの詳細のデーターをそのまま引き継ぎファイルの選択だけでいいようにしたいのですが?
f-otake

2014/12/30 02:27

自己レスです。下記のようにすることで成功しました。 def create file = params[:doc][:file] begin 作る作業 rescue => ex @doc = Doc.new(doc_params) flash[:alert] = 'ファイルが選択されていません!' render :new end end
f-otake

2014/12/30 02:34

この問題を解決済みにしたいのですが、どうやって解決済みにするか解りません。
guest

0

create メソッドの先頭部で params に処理に必要なデータが設定されているかをチェックすれば良いと思います。

参考:

自分で params[:doc], params[:doc][:file] の存在をチェックして、render なり、redirect しても良いです。

投稿2014/12/27 03:07

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問