我正在使用单个可制表继承(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方法无法保存文章。它只是重定向以创建新的文章页面。
你能帮我解决一下这个问题吗?
答案 0 :(得分:2)
好的,params的印刷有帮助。将其添加到您的TutorialArticle模型:
def self.model_name
return Article.model_name
end
这将使您的表单通过文章而不是tutorial_article,其余的应该按预期工作。您需要在所有其他Article子类中使用此覆盖。