1

Railcastのネストされたフォームに従っています

例: 登録ページに 4 つのフィールド、編集ページに 12 のフィールドがあります (実際には、もっと基本的な情報が必要でした)。

新しい顧客が登録すると、編集ページで 12 のフィールドすべてに入力され、すべてがうまく機能しています。

しかし、古い顧客がログインすると(ネストされたフォームの作成前にすでに登録されています)、すべてのフィールドを取得するのではなく、4つのフィールドを取得するだけです

私はこのようなものを使用しています:

コントローラ

 def new

    @user = User.new
    @user.build_user_nickname_live
    @user.build_user_twitter_chipcount
    @user.user_twitter_reals.build
    @user.user_twitter_fakes.build
end

def edit

     @user = User.find(current_user.id)

  end

モデル

has_one :user_nickname_live

accepts_nested_attributes_for :user_nickname_live

has_one :user_twitter_chipcount

accepts_nested_attributes_for :user_twitter_chipcount

has_many :user_twitter_reals, :dependent => :destroy
   accepts_nested_attributes_for :user_twitter_reals,
   :allow_destroy => true

has_many :user_twitter_fakes, :dependent => :destroy
 accepts_nested_attributes_for :user_twitter_fakes,
   :allow_destroy => true

見る

<%= nested_form_for(resource, :as => resource_name,
                    :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>

    <div style="overflow: hidden;display: block;">
      <%= f.fields_for :user_nickname_live do |user_nickname_live| %>
          <!--span 2 and 4 with min-padding-->
          <div class="span2 min-padding">
            <label >Live Nickname</label>
          </div>
          <div class="span4 min-padding">
            <div class="input-control text">
              <%= user_nickname_live.text_field :nickname,:style=>"max-width: 253px;", :placeholder=>"Live nickname",:onchange=>"changeInfo();" %>
            </div>
          </div>
          <!--ends-->
      <% end %>
    </div>
    <div style="overflow: hidden;display: block">
      <%= f.fields_for :user_twitter_chipcount do |user_twitter_chipcount| %>
          <!--span 2 and 4 with min-padding-->
          <div class="span2 min-padding">
            <label >Chip count account</label>
          </div>
          <div class="span4 min-padding">
            <div class="input-control text">
              <%= user_twitter_chipcount.text_field :twitter_url,:style=>" max-width: 250px;", :id=>"twitter_url", :placeholder=>"Chip count account" ,:onchange=>"changeInfo();" %>
            </div>
          </div>
          <!--ends-->
      <% end %>
    </div>

    <div id="real-one" style="display:block;position: relative;">
      <div class="add-click">
        <%= f.link_to_add "", :user_twitter_reals, :class=>"icon-plus",:style=>"font-size: 14px;", :data => { :target => "#real-field" } %>
      </div>
      <%= f.fields_for :user_twitter_reals do |real_one| %>
          <div id="real-field"  style="overflow: hidden;">
            <!--span 2 and 4 with min-padding-->
            <div class="span2 min-padding">
              <label >Real</label>
            </div>
            <div class="span4 min-padding">
              <div class="input-control text" >
                <%= real_one.text_field :twitter_url,:style=>"max-width: 250px;",:placeholder=>"Real",:onchange=>"changeInfo();" %>
                <%= real_one.link_to_remove "", :class=>"icon-minus minus-click" %>
              </div>
            </div>
            <!--ends-->

          </div>
      <% end %>
    </div>

    <div id="twitter-fake" style="display: block;position: relative;">
      <div class="add-click">
        <%= f.link_to_add "", :user_twitter_fakes, :class=>"icon-plus",:style=>"font-size: 14px;", :data => { :target => "#fake-field" } %>
      </div>
      <%= f.fields_for :user_twitter_fakes  do |user_twitter_fake| %>

          <div id="fake-field"  style="overflow: hidden;">
            <!--span 2 and 4 with min-padding-->
            <div class="span2 min-padding">
              <label >Fake</label>
            </div>
            <div class="span4 min-padding">
              <div class="input-control text">
                <%= user_twitter_fake.text_field :twitter_url,:style=>"max-width: 250px;",:placeholder=>"Fake",:onchange=>"changeInfo();" %>
                <%= user_twitter_fake.link_to_remove "", :class=>"icon-minus minus-click" %>
              </div>
            </div>
            <!--ends-->
          </div>
      <% end %>
    </div>
<% end %>

お願い助けて。

4

1 に答える 1

0

当時、これらの関連付けを作成した古いユーザーは存在しませんでした。

したがって、古いユーザーがプロファイルを次のように編集したい場合:

<%= f.fields_for :user_nickname_live do |user_nickname_live| %>

関連付けが DB に構築されていないため、何も表示できません。

移行、rake タスク、またはバックグラウンド タスクを作成するか、irb で修正して、古いユーザーのユーザーの関連付けを追加できます。

試していませんが、うまくいくはずです。移行の呼び出しを作成します。例: build_user_nickname_live_associations と入れます:

def up
  users = User.find(:all)

  users.each do |u|
    unless u.nick_name_live.present?
      u.build_nick_name_live
      u.save
    end
  end
end
于 2013-07-23T08:30:44.700 に答える