0

我的应用程序有两个关联模型:杂志和文章:

class Magazine < ActiveRecord::Base
  has_one :article
end

class Article < ActiveRecord::Base
  belongs_to :magazine
  validation_presence_of :title
end

从杂志展示页面我可以创建一个新文章,所以我的 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 的未定义方法“model_name” 。我认为这是因为@magazine参数在帮助程序中传递。

如果不使用 redirect_to 我怎么能解决这个问题?(我想保留表单中填写的其他属性。)

4

1 回答 1

0

您的form_for_params方法正在返回nil,因为action_name设置为“创建”,而不是“新”或“编辑”。

试试这个:

elseif action_name == 'new' or action_name == 'create'
  [@magazine, @article]
于 2012-05-21T01:31:12.633 回答