ネストされたリソース (「フォルダー」という名前) インデックスを親 (「ユーザー」という名前) の「表示」ビューアーに埋め込もうとすると、ある種の問題が見つかりました。データベースの作成/移行を行った後 (「フォルダー」テーブルで明示的なアクションがまだ実行されていない場合)、ユーザー エントリを作成します。作成直後、このユーザーの「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