0

我正在使用单表继承(STI)来创建不同类型的文章。但是现在我在创建文章时遇到了问题。(我只能在控制台中完成)。

这是我的模型

文章.rb

class Article < ActiveRecord::Base
  attr_accessible :content, :title      
  validates :title, :presence => true
end

和 TutorialArticle.rb

class TutorialArticle < Article
  attr_accessible :author  
  validates :author, :presence => true          
end

这是我的_form

<%= form_for(@article) do |f| %>
    <%= f.hidden_field :type %>    

    <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </div>

  <%= render :partial => "edit" + f.object.type.downcase, :locals=>{:f=>f} %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

但是现在我在 create 方法的 article_controller.rb 中有一个问题

def create
    # create the desired subtype based on the hidden field :type in the form        
    @article = Object.const_get(params[:article][:type]).new(params[:article])      

    if @article.save
      flash[:notice] = "Successfully created post."
      redirect_to @article
    else
      render :action => 'new'
    end
  end

现在,当我填写表格并按创建文章按钮时,出现以下错误

undefined method '[]' for nil:NilClass

我什至尝试硬编码以了解问题所在以及是否尝试更改@article = Object.const_get(params[:article][:type]).new(params[:article])

 @article = TutorialArticle.new(params[:article]) 

我的创建方法不保存文章。它只是重定向以创建新的文章页面。

你能帮我解决这个问题吗?

4

1 回答 1

2

好的,参数的打印有所帮助。将此添加到您的 TutorialArticle 模型中:

def self.model_name
  return Article.model_name
end

这将使您的表单通过文章而不是 tutorial_article,其余的应该按预期工作。您将在所有其他文章子类中都需要此覆盖。

于 2013-07-05T14:38:38.560 回答