更新:已解决。谢谢忙马克!
编辑:这是根据 BushyMark 的以下回答进行修改的。我认为我正确地进行了所有建议的更改,但是当用户提交消息时,我仍然无法将 post_type_id 保存到数据库中。
我的应用程序有一个个人资料页面。在个人资料页面上,页面所有者可以键入更新并点击“提交”。更新消息出现时无需重新加载页面(即 Ajax)。
它基本上看起来像您的 Twitter 主页。但是,我们的用户在输入更新时也会选择一个消息“类型”。消息类型是一个预先填充的列表。我已将其作为模型并将其作为种子数据加载到应用程序中。
所以:有一个 profile 模型、一个 post 模型和一个 post_type 模型。
profile has_many :posts
post belongs_to :post_type
post_type has_many :posts
后模型也有这个:attr_accessible :message, :post_type_id
Routes.rb 看起来像这样:
map.resources :users, :has_one => :profile, :has_many => :posts
map.resources :post_types
帖子控制器有这种创建帖子的方法:
def create
@post = current_user.profile.posts.build(:message => params[:message], :post_type_id => params[:post_type_id])
if @post.save
redirect_to user_profile_path
else
flash[:notice] = "Message failed to save."
redirect_to user_profile_path
end
end
发生这一切的个人资料页面的“显示”视图如下所示:
<% form_tag(:controller => "posts", :action => "create") do %>
<%= label_tag(:message, "Update your people") %><br />
<%= text_area_tag(:message, nil, :size => "27x3") %>
<div class="updateSubmit"><%= submit_tag("Update") %></div>
<%= label_tag(:type_id, "Optional: Update type", :class => 'typeLabel') %>
<%= collection_select(:post, :post_type_id, PostType.all, :id, :name, {:prompt => true}) %>
<% end %>
<% @profile.profile.posts.each do |c| %>
<%=h c.message %></div>
<p><%=h c.post_type %></p>
<p>Posted <%=h time_ago_in_words(c.created_at) %> ago</p>
<% end %>
这就是背景。这就是问题所在。使用我当前的设置,当用户提交他的消息时,消息被发送到帖子数据库表,但 post_id 没有。
我的选择标签呈现如下:
<select id="post_post_type_id" name="post[post_type_id]"><option value="">Please select</option>
这是我提交帖子时在日志中得到的输出:
Processing PostsController#create (for IP at 2009-09-03 03:03:08) [POST]
Parameters: {"message"=>"This is another test.", "commit"=>"Update", "action"=>"create", "authenticity_token"=>"redacted", "post"=>{"post_type_id"=>"3"}, "controller"=>"posts", "user_id"=>"1"}
User Load (0.3ms) SELECT * FROM "users" WHERE ("users"."id" = 1)
Profile Load (0.7ms) SELECT * FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1
Post Create (0.5ms) INSERT INTO "posts" ("message", "updated_at", "post_type_id", "profile_id", "created_at") VALUES('Hello', '2009-09-03 20:40:24', NULL, 1, '2009-09-03 20:40:24')
这是我的架构的相关部分,根据 BushyMark 的评论进行了更新:
`create_table "post_types", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end`
`create_table "posts", :force => true do |t|
t.text "message"
t.integer "profile_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "post_type_id"
end`