获取rails表单中的关联值

时间:2011-02-15 17:03:15

标签: ruby-on-rails forms associations formtastic

我正在构建一个应用程序,其中用户有任务,任务有位置。 使用formtastic_cocoon将任务和位置放在nested_form中,formtastic_cocoon是带有jQuery扩展的formtastic gem。

location.address字段是一个自动填充文本字段,用于搜索数据库中已存在的地址。因此,当用户选择地址时,将填充表单中的隐藏location_id。

我想要做的是,当用户去编辑任务时,我希望它显示当前选择的地址,但我没有看到任何可以检索该值的地方。我可以获得location_id,因为它在任务模型中,但我似乎无法获得关联的location.address。

模型

class Task < ActiveRecord::Base
     attr_accessible :user_id, :date, :description, :location_id

     belongs_to :user
     has_one :location
end

class Location < ActiveRecord::Base
     attr_accessible :address, :city, :state, :zip

     has_many :tasks
end 

然后以我的形式,我有

  <div class="nested-fields"> 
     <%= link_to_remove_association "remove task", f %>
      <div class="searchAddress">
         < input type="text" value="HERE IS WHERE I WANT TO SHOW THE ADDRESS" >
     </div>
   <%= f.hidden_field :location_id %>
   <%= f.inputs :date, description %>
</div>

-----------编辑包含所有形式代码---------------

form.html.erb
<%= semantic_form_for @user, :html=>{:multipart=true} do |form| %>

    <%= form.inputs :username, :photo %>


      <%= form.semantic_fields_for :tasks do |builder | %>

   <%= render 'task_fields', :f => builder %>
  <% end %>
<% end %>

-------结束编辑-------------- 我尝试输出不同的'f'方式,但没有看到任何对相关位置的引用,但如果我在表单外部调试User.Task [0] .Location,我会得到正确的位置详细信息。我如何在表格中找到它?

---------更新------------

更加接近这一点。事实证明我可以输出

<%= debug f.object %>

我得到了返回的任务对象。不幸的是,它不包括location对象,只包含location_id字段的值。

2 个答案:

答案 0 :(得分:0)

您是否尝试过@ task.location.address?

答案 1 :(得分:0)

您的方法是正确的。但是,有一些幻灯片误解概念宣告了关联。我想进行如下更改:

# app/models/task.rb

class Task < ActiveRecord::Base
  attr_accessible :user_id, :location_id, :date, :description

  belongs_to :user
  belongs_to :location
end

由于我们将location外键存储在tasks表中,因此最好在此处声明belongs_to关联。

# app/models/location.rb

class Location < ActiveRecord::Base
  attr_accessible :address, :city, :state, :zip

  has_many :tasks

  # this method will return full address of a location
  def full_address
    [address, city, state, zip].reject(&:blank?).join(", ")
  end
end 

然后,您需要添加所选位置的full_address

# app/views/users/_task_fields.html.erb

<div class="nested-fields"> 
  <%= link_to_remove_association "remove task", f %>
  
  <div class="searchAddress">
    <input type="text" value="<%= f.object.location&.full_address %>">
  </div>
  
  <%= f.hidden_field :location_id %>
  <%= f.inputs :date, description %>
</div>