是什么导致了此 AssociationTypeMismatch 错误?

发布于 2024-11-03 16:06:58 字数 2549 浏览 0 评论 0原文

我正在创建基本的留言板,其中许多评论属于一个帖子,而一个帖子仅属于一个主题。我的问题是,我不确定如何从 Post 模型的表单创建新的 Topic 。我在我的帖子控制器中收到错误:

ActiveRecord::AssociationTypeMismatch in PostsController#create

Topic(#28978980) expected, got String(#16956760)

app/controllers/posts_controller.rb:27:in `new'
app/controllers/posts_controller.rb:27:in `create'

app/controllers/posts_controller.rb:27:

@post = Post.new(params[:post])

这是我的模型:

topic.rb:

class Topic < ActiveRecord::Base
  has_many  :posts, :dependent => :destroy
  validates :name,  :presence => true,
                    :length => { :maximum => 32 }
  attr_accessible   :name  
end

post.rb:

class Post < ActiveRecord::Base
  belongs_to :topic,    :touch => true
  has_many   :comments, :dependent => :destroy
  attr_accessible :name, :title, :content, :topic
  accepts_nested_attributes_for   :topics, :reject_if => lambda { |a| a[:name].blank? }
end

comment.rb:

class Comment < ActiveRecord::Base
  attr_accessible        :name, :comment
  belongs_to :post, :touch => true
end

我有一个表单:

<%= simple_form_for @post do |f| %>
  <h1>Create a Post</h1>
  <%= f.input :name %>
  <%= f.input :title %>
  <%= f.input :content %>
  <%= f.input :topic %>  
  <%= f.button :submit, "Post" %>  
<% end %>

它是控制器操作:(帖子创建)

def create
  @post = Post.new(params[:post]) # line 27
  respond_to do |format|
    if @post.save
      format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
    else
      format.html { render :action => "new" }
    end
  end
end

在我找到的所有示例中,标签属于帖子。我正在寻找的是不同的,而且可能更容易。我希望帖子属于单个标签,即主题。如何通过Post控制器创建Topic?有人能指出我正确的方向吗?非常感谢您阅读我的问题,我真的很感激。

我正在使用 Rails 3.0.7 和 Ruby 1.9.2。哦,这是我的架构,以防万一:

create_table "comments", :force => true do |t|
  t.string   "name"
  t.text     "content"
  t.integer  "post_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "posts", :force => true do |t|
  t.string   "name"
  t.string   "title"
  t.text     "content"
  t.integer  "topic_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "topics", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

再次感谢。

I'm creating basic message board where many comments belong to a post and a post belongs to only one topic. My issue is that I'm not sure how create a new Topic from the Post model's form. I'm receiving an error in my Post controller:

ActiveRecord::AssociationTypeMismatch in PostsController#create

Topic(#28978980) expected, got String(#16956760)

app/controllers/posts_controller.rb:27:in `new'
app/controllers/posts_controller.rb:27:in `create'

app/controllers/posts_controller.rb:27:

@post = Post.new(params[:post])

Here are my models:

topic.rb:

class Topic < ActiveRecord::Base
  has_many  :posts, :dependent => :destroy
  validates :name,  :presence => true,
                    :length => { :maximum => 32 }
  attr_accessible   :name  
end

post.rb:

class Post < ActiveRecord::Base
  belongs_to :topic,    :touch => true
  has_many   :comments, :dependent => :destroy
  attr_accessible :name, :title, :content, :topic
  accepts_nested_attributes_for   :topics, :reject_if => lambda { |a| a[:name].blank? }
end

comment.rb:

class Comment < ActiveRecord::Base
  attr_accessible        :name, :comment
  belongs_to :post, :touch => true
end

I have a form:

<%= simple_form_for @post do |f| %>
  <h1>Create a Post</h1>
  <%= f.input :name %>
  <%= f.input :title %>
  <%= f.input :content %>
  <%= f.input :topic %>  
  <%= f.button :submit, "Post" %>  
<% end %>

And it's controller action: (posts create)

def create
  @post = Post.new(params[:post]) # line 27
  respond_to do |format|
    if @post.save
      format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
    else
      format.html { render :action => "new" }
    end
  end
end

In all of the examples I find, tags belong to posts. What I'm looking for is different and probably easier. I want a post to belong to a single tag, a Topic. How can I create a Topic through the Post controller? Can someone point me in the right direction? Thank you very much for reading my question, I really appreciate it.

I'm using Rails 3.0.7 and Ruby 1.9.2. Oh and here's my schema just in case:

create_table "comments", :force => true do |t|
  t.string   "name"
  t.text     "content"
  t.integer  "post_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "posts", :force => true do |t|
  t.string   "name"
  t.string   "title"
  t.text     "content"
  t.integer  "topic_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "topics", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

Thanks again.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

無處可尋 2024-11-10 16:06:58

您应该在 Post 上添加:,

accepts_nested_attributes_for :topic

而不是相反。

You should have:

accepts_nested_attributes_for :topic

on Post rather than the other way around.

猫腻 2024-11-10 16:06:58

我的控制器中的 @post = Post.new(params[:topic]) 修复了错误。

@post = Post.new(params[:topic]) in my controller fixed the error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文