rails:使用STI创建帖子

时间:2013-07-05 13:44:37

标签: ruby-on-rails rails-activerecord sti

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

以下是我的模特

Article.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 method

中的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]) 

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

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

1 个答案:

答案 0 :(得分:2)

好的,params的印刷有帮助。将其添加到您的TutorialArticle模型:

def self.model_name
  return Article.model_name
end

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