2017-03-20 4 views
0

を失敗した後のフォームは、私はハッシュの配列の反復処理を含むフォーム持つローカル変数を保持しません:私はので、私は地元の人々を通じて、KとVを渡していないよ検証が

<% @user.profile["addresses"].each_with_index do |(k,v), i| %> 
    <%= render partial: 'users/form/addresses_fields', locals: { f: f, i: i } %> 
<% end %> 

注意を例えば、代わりにフォームヘルパータグを使用して、と私はインデックスのみを使用する必要があります。

<%= label_tag "user[profile][addresses]["+i.to_s+"][street]", "Street" %> 
<%= text_field_tag "user[profile][addresses]["+i.to_s+"][street]" %> 

提出すると、検証が失敗し、コントローラの再ビューをレンダリングする時はいつでも、私はundefined local variable or method 'i' for #<#<Class:0x007fc53e26b690>:0x007fc53f5ba688>

言う Name Errorを持っています210

これは、検証が失敗した後にビューを再レンダリングするときに、Railsが埋め込みまたはローカルで定義された変数を考慮しないことを意味しますか?

私はまた、<% i = 0 %>のようなビューで変数を定義してみましたが、各繰り返しでインクリメントしていきましたが、問題は残っています。

その他の考慮事項:ユーザーは、検証時に完全に罰金が失敗保持されて埋めすべてのフィールド、問題は、このような場合には、ローカル変数で、私はこの問題を克服するにはどうすればよいeach_with_index

の指標であります?user.profileは、JSONBデータ型の列です。

他のいくつかのモデルを構築せずに、モデルのネストされた属性を処理するためにJSONとJSONBのデータ型の列を使用する人が増えているので、これはよくある問題です。

他の関連コード:

コントローラー:

def update 
    if @user.custom_update_attributes(user_params) 
    flash[:success] = "Updated!" 
    redirect_to current_user 
    else 
    render 'edit' 
    end 
end 

モデル方法:

def custom_update_attributes(params) 
    name = params["profile"]["name"] 
    gender = params["profile"]["gender"] 
    birthday = params["profile"]["birthday"] 
    phone = params["profile"]["phone"] 
    addresses = params["profile"]["addresses"] 

    self.profile["name"] = name 
    self.profile["gender"] = gender 
    self.profile["birthday"] = birthday 
    self.profile["phone"] = phone 

    #addresses 
    updated_addresses = {} 
    i = 0 
    unless addresses.blank? 
     addresses.each do |key, val| 
     if val["_destroy"] == "1" 
      #pass 
     else 
      #add 
      updated_addresses[i] = val.except("_destroy") 
      i = i + 1 
     end 
     end 
    end 
    self.profile["addresses"] = updated_addresses 

    self.profile_will_change! 
    self.save 
    end 

私はBYEBUGの宝石を使用して何が起こっているのか見つけたと思う:

失敗しているコードの行は以下の通りです:

<%= text_field_tag "user[profile][addresses]["+i.to_s+"][street]", @user.profile["addresses"][i.to_s]["street"] %> 

ページが最初にフォームをロードすると、そのコード行が完全に正常に動作します。しかし、検証が失敗した場合は[i.to_s]から@user.profile["addresses"][i.to_s]["street"]が未定義となり、文字列に変換せずに[i]に変更すると、検証エラーのページが完全に正常に読み込まれます。

ハッシュの配列を処理する方法に問題があると思います。なぜなら最初に配列の各インデックスをサブハッシュのキーとみなし、検証が失敗したときにインデックスとして各インデックスを考慮するからですキーの配列ではなく配列の番号です(文字列ではありません)。奇妙な。この問題を解決するために

+1

コントローラとモデル法@Gastonコントローラメソッド – Gaston

+0

@Gastonが完璧に働いている投稿してください妥当性検証成功時には問題ない。 – aleherzko

+0

で更新お使いのコントローラメソッド – aleherzko

答えて

0

は、私は、フォームの入力のいずれかの前に、以下を追加しました:

<% if @user.profile["addresses"][i.to_s] != nil %> 
    <% i = i.to_s %> 
<% else %> 
    <% i = i %> 
<% end %>