Я создаю базовую доску объявлений, в которой много комментариев относятся к сообщению, а сообщение относится только к одной теме. Моя проблема в том, что я не уверен, как создать новую Topic
из формы Post
модели. Я получаю сообщение об ошибке в своем контроллере почты:
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'
приложение / контроллеры / 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
Во всех примерах, которые я нахожу, теги принадлежат постам. То, что я ищу, отличается и, вероятно, проще. Я хочу, чтобы сообщение принадлежало одному тегу 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
Еще раз спасибо.