私のアプリケーションには、Magazine と Article の 2 つのモデルが関連付けられています。
class Magazine < ActiveRecord::Base
has_one :article
end
class Article < ActiveRecord::Base
belongs_to :magazine
validation_presence_of :title
end
Magazine ショー ページから新しい記事を作成できるので、routes.rb は次のように構成されます。
resources :magazines, :shallow => true do
resources :articles
end
雑誌のショーページには、次のような「新しい記事」のリンクがあります。
<%= link_to 'New article', new_magazine_article_path(@article)
正しいパラメーターを form_for に渡す記事ヘルパー:
module ArticlesHelper
def form_for_params
if action_name == 'edit'
[@article]
elsif action_name == 'new'
[@magazine, @article]
end
end
end
Article form_for を次のように使用できます。
<%= simple_form_for(form_for_params) do |f| %> ...
new および create の ArticlesController メソッドは次のとおりです。
respond_to :html, :xml, :js
def new
@magazine = Magazine.find(params[:magazine_id])
@article = Article.new
end
def create
@magazine = Magazine.find(params[:magazine_id])
@article = @magazine.build_article(params[:article])
if @article.save
respond_with @magazine # redirect to Magazine show page
else
flash[:notice] = "Warning! Correct the title field."
render :action => :new
end
end
この問題は、title 属性で検証エラーが発生し、アクション new がレンダリングされた場合に発生します。この瞬間、form_forの最初の行にあるNilClass:Class の undefined method `model_name'というメッセージが表示されます。@magazineパラメータがヘルパーに渡されたためだと思います。
redirect_to を使用せずにこの問題を解決するにはどうすればよいですか? (フォームに入力された他の属性を維持したい。)