如何使复选框适用于rails 3中的另一个表?

时间:2013-05-08 05:33:46

标签: ruby-on-rails ruby ruby-on-rails-3 checkbox

我有两个存储内容的表(2个单独的模型:微博和线程)

除了名字

之外,它们非常相似
create_table "microposts", :force => true do |t|
    t.text     "content"
    t.integer  "user_id"
    t.datetime "created_at",                         :null => false
    t.datetime "updated_at",                         :null => false
    t.boolean  "review",          :default => false
  end

create_table "threads", :force => true do |t|
    t.text     "content"
    t.integer  "user_id"
    t.datetime "created_at",                         :null => false
    t.datetime "updated_at",                         :null => false
  end

这就是我所看到的

<%= form_for @micropost, :html => {:multipart => true} do |f| %>
  <%= render 'shared/error_messages', object: @micropost %>
  <div class="field">
    <%= f.text_area :content, :cols => 5, :rows => 5, :placeholder => "This field is required" %>
  </div>
    <label for="a"><%= label_tag(:micropost_review, "Does this need review?") %><%= f.check_box :review %></label></div>
 <br><br>
<%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

我想要做的是,而不是更新review属性的复选框(label_tag),我想将form_for更改为线程。如果在提交之前选中了复选框,我希望它填充线程表,而不是填充微博表。更新上述视图的最佳方法是什么? 感谢

1 个答案:

答案 0 :(得分:0)

这可以(而且应该)在MicropostsController中轻松完成,而不是View。假设这应该创建一个新的Micropost或Thread:

def create
  if params[:micropost][:review]
    params[:micropost].delete :review
    @thread = Thread.create!(params[:micropost])
  else
    @micropost = Micropost.create!(params[:micropost])
  end
 end

请注意,避免传递额外的属性来创建是很重要的!或者它会失败。

另外,不要使用Thread,因为它是一个保留字,可能会产生一些非常“有趣”的后果......