2016-07-06 8 views
1

私はそのようなフォームをレンダリングしています:_file_form.html.slimでレール:nilのための未定義のメソッド `ID」:NilClass

= f.fields_for :files do |files_form| 
    = render('file_form', f: files_form) 

私はそのようなコードがあります。

- id = f.object.id 
- file= f.object.files.first 

li.panel.panel-default 
    .panel-heading role="tab" id="heading" 
    a.file-heading data-toggle="collapse" data-parent="#files" href="#collapse#{id}" 
     div.clearfix role="button" 
     span = f.object.name 
    .panel-collapse.collapse-in id="collapse#{id}" role="tabpanel" 
    .panel-body 
     .clearfix = link_to(t('shared.destroy'), '#', class:'btn btn-warning btn-sm discard-file pull-right') 
     .form-group 
     = f.label(:name, t('activerecord.attributes.file.name')) 
     = f.text_field(:name, class: 'form-control') 
     = f.label(file.id) //my problem 

すべての作品をファイルIDでラベルを取得しようとするまで、うまくいきます。

エラーメッセージ:未定義のメソッドはnilのための `のid」:NilClass

初期化されていないように見えますが、私はfile.idと行の前にデバッガでそれを確認したときに、実際に、それはあります初期化され、私は簡単に値をチェックすることができます。

file.idの代わりにidを使用していると、すべて正常に動作します。どうして?

ファイルからID(または他のデータ)を取得しようとすると、ファイルがnilクラスになるのはなぜですか?

+0

検査後にidとfileの値を投稿できますか? – SnehaT

+0

はこれを作成または編集するためのものですか? – xploshioOn

答えて

0

filesコレクションが空です。したがって、file = f.object.files.firstを実行すると、fileローカル変数にnilが割り当てられます。

名前がidの属性を持つオブジェクトとしてアクセスしようとすると、予想通りにスローされます。

f.label(file.try(:id)) 

または

f.label(file&.id) # Ruby 2.3.0 and up 

または

f.label(file.id rescue 'placeholder label') 

あなたは、コレクション内の要素がない場合は救済やnil値を処理するために技術を使用するか、あなたのユースケースに応じて、

更新

fields_forの場合、親モデルは、使用する関連オブジェクトの属性を受け入れる必要があります。あなたが親モデルでこれを持っていることを確認してください:後者の行がある場合を除き

has_many :files 
accepts_nested_attributes_for :files 

は、フォームオブジェクトは、あなたが観察している行動の理由とすることができる、nilになります。

+0

それは私のために働いていない、今私はエラーが発生しました '未定義のメソッド 'humanize'のためのnil:NilClass ' – yqbk

+0

私の更新された答えを見てください。また、あなたのモデルの関連付けの定義をあなたの質問に追加し、さらにエラーがある場合の完全なエラー出力を追加してください。 –

関連する問題