Нет вывода через fields_for при использовании отношения «один к одному»

#ruby-on-rails #ruby-on-rails-3 #one-to-one #has-one #fields-for

#ruby-on-rails #ruby-on-rails-3 #один к одному #имеет-один #поля-для

Вопрос:

У меня возникли некоторые проблемы при попытке заставить * fields_for * выдать вывод при попытке отобразить мою модель пользователя и профиля в одной форме, они используют отношения * has_one * и * belongs_to *.

Итак, вот выдержки из верхней части классов модели:

 class User < ActiveRecord::Base
  has_one :profile
  accepts_nested_attributes_for :profile

class Profile < ActiveRecord::Base
  belongs_to :user
  

Контроллер довольно простой и стандартный:

   def new
    @user = User.new
  end

  def edit
    @user = User.find(params[:id])
  end
  

И вот фрагмент из представления в его текущем виде:

 <%= form_for(@user) do |f| %>

  <% f.fields_for :profile do |profile_form| %>
    <div class="field">
      <%= profile_form.label :name %><br />
      <%= profile_form.text_field :name %>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
  

Я пробовал другие вещи, подобные этому:

  <% fields_for @user.profile do |profile_form| %>
  

И все работает нормально, если я вручную добавляю поле:

   <div class="field">
    <label for="user_name">Name</label><br>
    <input id="user_name" name="user[profile_attributes][name]" size="30" type="text" value="<%= @user.profile.name %>">
  </div>
  

Стоит упомянуть, что я довольно новичок в rails и не совсем уверен, как эти функции работают под капотом, хотя я прочитал документацию и руководство. Также в моих поисках много примеров fields_for отношения «один ко многим», так что, возможно, я неправильно подхожу к этому вопросу?

Мы высоко ценим любую помощь, советы и дальнейшее чтение 🙂

Приветствия,

Сэм

Ответ №1:

В вашем коде:

 <% f.fields_for :profile do |profile_form| %>
  

Разве это не должно быть написано так (из-за нового поведения Rails 3):

 <%= f.fields_for :profile do |profile_form| %>
  

Комментарии:

1. Я знал, что это будет что-то простое — большое спасибо 🙂 Я запустил rails только с версии 3, при поиске может быть сложно посмотреть на различия между версиями, хотя что-то подобное можно легко пропустить. Что-нибудь, что стоит прочитать в связи с этим?

2. На самом деле нет. Помощникам было сложно писать в Rails 2 (хотя и более экономично с точки зрения памяти), если они использовали блок ERB ( do %> ... <% end ). В Rails 3 они решили просто заставить все работать как простую строку. Таким образом, если вы забудете добавить = , строка не будет напечатана. Но во многих примерах из Rails 2 раза этого не будет = — предостережение.

3. Я уже 2 часа пытаюсь заставить это работать. Вы полностью спасли меня этим — просто жаль, что я не погуглил это раньше! Большое спасибо!