0

ネストされたリソース (「フォルダー」という名前) インデックスを親 (「ユーザー」という名前) の「表示」ビューアーに埋め込もうとすると、ある種の問題が見つかりました。データベースの作成/移行を行った後 (「フォルダー」テーブルで明示的なアクションがまだ実行されていない場合)、ユーザー エントリを作成します。作成直後、このユーザーの「show」メソッドは、NilClass のフィールドを持つフォルダーを表示します。どのユーザーが表示されるかに関係なく、1 つのエントリには、デフォルトで常にこの Nil-ed エントリが含まれます。他のエントリを追加できますが、これは常に表示されます。

興味深い点もあります。Rails コンソールでは @user.folders は空の配列を返し、その #each メソッドはうまく機能します (つまり、コンソールではすべてが適切に機能し、この問題は発生しません)。

ネストされたリソースの「作成」メソッドは次のとおりです。

class FoldersController < ApplicationController
  def create
    @user = User.find params[:user_id]
    @user.folders.create params[:folder]
    redirect_to user_path @user
  end

users/show.html.haml - 親ビューアー (コードを読みやすくするために、ユーザー情報の出力は省略されています):

Add a folder:
=form_for [ @user, @user.folders.build] do |f|
  .field
    =f.label :name
    =f.text_field :name
  .actions
    =f.submit

%br
User's folders:
%table
  %tr
    %th Name
    %th
    %th
  -@user.folders.each do |folder| # Will make at least one iteration even if 
                                  # no entries have been created yet. Works  
                                  # properly in rails console
      %tr
        %td= folder.name.class ## here will be NilClass in that default entry
        %td= link_to 'Show', user_folders_path(@user, folder)
        %td= link_to 'Delete', [@user, folder], :confirm => 'Are you sure?', :method => :delete

私は Rails と Web ベースのアプリケーションの両方に慣れていないので、コーディングの間違いを批判するだけでなく、適切に説明されていないことがあれば遠慮なく質問してください。

更新: UserController::create メソッド:

def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render json: @user, status: :created, location: @user }
    else
      format.html { render action: "new" }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end
4

1 に答える 1

1

同様の問題に遭遇しました。使用している form_for タグで

@user.folders.build

適切な user_id 属性を使用して、空のフォルダー レコードをフォルダー オブジェクトに追加しています。

コードの下部で、同じフォルダー オブジェクトを反復処理しているため、空のレコードが表示されます。

単純にフォーム コードをフォルダー コードのテーブルの下に配置すると、空のレコードが存在しないことがわかります (まだ作成されていないためです!)。

于 2014-04-21T23:55:21.540 に答える