has_many记录插入

时间:2012-03-20 16:08:54

标签: ruby-on-rails activerecord has-many

我想在新地方插入标签。给这些标签是不同的模型。

####### models ##########
class Tag < ActiveRecord::Base
  belongs_to :place
  attr_accessible :tag
end

class Place < ActiveRecord::Base
  has_many :tags
end

如何在新的Place创建表单中处理此问题?和places_controller中的创建动作?这样我就可以插入新的地方和mant标签,然后将产品ID分配给每个标签。

####### place controller ##########

def create
  @place = Place.new(params[:place])
  @tag = Tag.new(params[:?????]) #this should be more than once

  respond_to do |format|
    if @place.save
      format.html { redirect_to @place, notice: 'Place was successfully created.' }
      format.json { render json: @place, status: :created, location: @place }
    else
      format.html { render action: "new" }
      format.json { render json: @place.errors, status: :unprocessable_entity }
    end
  end
end

####### place new form ##########
<%= form_for @place do |f| %>     
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br />
    <%= f.text_area :description %>
  </div>
  <div class="field">
    <%= f.label :rank %><br />
    <%= f.text_field :rank %>
  </div>
  <div class="field">
    <%= f.label :lat %><br />
    <%= f.text_field :lat %>
  </div><div class="field">
    <%= f.label :lng %><br />
    <%= f.text_field :lng %>
  </div>
  <div class="field">
    <%= f.label :address %><br />
    <%= f.text_area :address %>
  </div>
  <div class="field">
    <%= f.label :website %><br />
    <%= f.text_field :website %>
  </div>
  <div class="field">
    <%= f.label :phone %><br />
    <%= f.text_field :phone %>
  </div>
  <div class="field">
    <%= label_tag "tags" %>
    <%= f.text_field :tag %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

2 个答案:

答案 0 :(得分:1)

  1. 如果你想自己做,你应该看一下accepts_nested_attributes_for,其中有一篇由Ryan Bates撰写的精彩的2部分教程railscasts.com

  2. 如果您不想自己动手,可以使用多种标签宝石,例如: ActsAsTaggableOn

答案 1 :(得分:0)

在表单中添加:

<%= f.fields_for :tags do |t| %>
    <%= t.label :name %>
    <%= t.text_field :name %>
<% end %>

Place模型中:

accepts_nested_attributes_for :tags

在您的控制器中,您甚至不必担心创建标签。

您仍然应该尝试阅读有关fields_foraccepts_nested_attributes_for的内容,因为您的问题很常见,所以它们通常很有用。