получить значения ассоциации в формах rails

Я создаю приложение, в котором у пользователя есть задачи, а задача имеет местоположение. Задачи и местоположения находятся в вложенной_форме с использованием formtastic_cocoon, который является жемчужиной formtastic с расширением jQuery.

Поле 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_id.


person pedalpete    schedule 15.02.2011    source источник
comment
Вы находитесь в <%= form_for @task do |f| %>, верно?   -  person LapinLove404    schedule 15.02.2011
comment
похоже, я нахожусь в semantic_fields_for, который больше похож на fields_for, чем на form_for   -  person pedalpete    schedule 15.02.2011
comment
да, используя formtastic_cocoon, который является formtastic с расширением jQuery   -  person pedalpete    schedule 15.02.2011
comment
f.object.location не возвращает местоположение?   -  person LapinLove404    schedule 22.02.2011


Ответы (2)


Вы пробовали @task.location.address ?

person LapinLove404    schedule 15.02.2011
comment
Я пробовал это, я получаю неопределенный метод для «местоположения» для nil: Nilclass - person pedalpete; 15.02.2011
comment
Разве это не означает, что @task равен нулю? - person LapinLove404; 15.02.2011
comment
@user.tasks не равен нулю, @user.task равен нулю. @user.tasks.location равно нулю - person pedalpete; 15.02.2011
comment
Не могли бы вы опубликовать свой полный код формы (formtastic)? Что это за объект for ? - person LapinLove404; 15.02.2011

Ваш подход правильный. Но есть какой-то слайд-промах-зачатие, декларирующий ассоциацию. Я хотел бы изменить, как показано ниже:

# 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>

person Palash Bera    schedule 07.10.2020