1

我正在尝试创建一个嵌套模板,其中将同时创建两个模型。模型如下:

模型/事件

#Data
  attr_accessible :customer_id, :description, :locations_attributes
#Relationship
  has_many :locations
  accepts_nested_attributes_for :locations, :allow_destroy => true

型号/地点

#Data
  attr_accessible :address, :customer_id, :event_id, :latitude, :longitude
#Relationship
  belongs_to :customer
  belongs_to :event

他的看法是这样的

<%= form_for(@event) do |f| %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <%= f.fields_for :locations do |e| %>
    <%= e.hidden_field :longitude %>
    <%= e.hidden_field :latitude %>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

控制器看起来像这样

  def new
    @event = Event.new
    @location = Location.new
    ...
  def create
    @event = current_customer.events.build(params[:event])
    @event.locations.build(params[:locations])
    respond_to do |format|
    ...

问题是,当我创建事件时,会生成表单,它会创建事件并创建位置并与事件关联,但我的经度和纬度字段为空。我必须注意它们是浮动类型,但我不明白为什么它不应该工作

更新:我注意到我能够访问 field_for 我必须将 field_for 更改为 single

 <%= f.fields_for :location do |e| %>

但是当这样做时,我在尝试创建事件时收到以下错误

Can't mass-assign protected attributes: location

参数如下

 "location"=>{"longitude"=>"-80.9460917",
 "latitude"=>"46.4350391"}

这是我的 javascript

function getLocation()
{
    if (navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(showPosition);
    }
}
    function showPosition(position)
    {
        document.getElementById('event_location_latitude').value=position.coords.latitude;
        document.getElementById('event_location_longitude').value=position.coords.longitude;
    }

我承认它很丑,但它完成了 application.js 的工作,我用表单中的函数调用了它

<script type="text/javascript">
   getLocation();
  </script>

就在表单的 <% end %> 之前

4

2 回答 2

0

看一下这个。

http://railscasts.com/episodes/196-nested-model-form-revised

如果您在查看后有任何问题。让我知道

在您的隐藏域代码中,您需要设置一个值。例如。

<%= f.hidden_field :song_id, value: params[:id] %>
<%= f.hidden_field :paid_price,  value: @song.price %>
于 2013-01-05T04:52:07.920 回答
0

你把 :location 放在你的 attr_accessible 中了吗?cz 你显示的错误是不能为你的位置批量分配

于 2013-01-05T05:10:49.317 回答