Назначьте идентификатор отношения записи при создании, но не при обновлении

У меня две модели: На странице много разделов. Я не использую вложенные ресурсы, потому что есть еще и третья модель. На моей странице # show у меня есть ссылка для создания нового раздела, принадлежащего текущей странице:

<%= link_to 'New Section', new_section_path(:page_id => @page) %>

И в моей форме сечения у меня есть:

<%= form_for(@section) do |f| %>
.
.
.
<div class="field">
  <%= f.label :title %><br />
  <%= f.text_field :title %>
</div>
<%= f.hidden_field :page_id, :value => params["page_id"] %>
<div class="actions">
  <%= f.submit %>
</div>

Проблема, конечно, в том, что это правильно передает page_id в новую форму раздела, но когда пользователь возвращается к форме через путь редактирования, params ["page_id"] пуст. Я хотел бы установить page_id один раз при создании и никогда больше не позволять его изменять (возможно, есть способ создать условие, которое удаляет это скрытое поле из формы, или еще более чистый способ?).

Большое спасибо за Вашу помощь.


person Duncan Malashock    schedule 05.11.2013    source источник
comment
Обертывание тега скрытого поля в ‹%, если params.has_key? (: Page_id)%› ... ‹% end%› работает. Есть ли лучший способ сделать это с помощью Rails?   -  person Duncan Malashock    schedule 05.11.2013
comment
без упаковки использовать встроенный <%= f.hidden_field(:page_id, :value => params["page_id"]) if params.has_key?(:page_id)%>   -  person Зелёный    schedule 05.11.2013
comment
Railsier будет использовать вложенные ресурсы (например, / pages / 1 / section / new). В чем сложность вашей третьей модели? Похоже, что ваш текущий подход допускает своего рода нарушенный рабочий процесс при создании разделов. Что происходит, когда пользователь возвращается к редактированию, а page_id не указан в параметрах? Создают ли они сиротский раздел? Это приемлемо?   -  person DiegoSalazar    schedule 05.11.2013
comment
Проблема в том, что в каждом разделе много блоков. Руководства Rails не рекомендуют использовать вложенные ресурсы более чем на двух уровнях. Я задаю этот вопрос именно из-за того, что вы говорите о сломанном рабочем процессе; Я ищу способ присвоения page_id только при создании.   -  person Duncan Malashock    schedule 05.11.2013


Ответы (1)


Вы хотите получать page_id не из параметров, а из ресурса. Вы должны сделать это, назначив идентификатор страницы новому ресурсу в контроллере.

В вашем контроллере:

def new
  # In reality you might create the new Section differently,
  # but you get the idea.
  #
  # In other scenarios the page_id might come from the parent
  # (in a nested route) or some other source not determined by
  # params.
  @section = Section.new(page_id: params[:page_id])
end

Затем в вашем шаблоне позвольте page_id заполниться естественным образом:

<%= f.hidden_field :page_id %>

Форма редактирования уже будет работать, поскольку запись уже имеет page_id (при условии, что все разделы имеют идентификаторы страниц, что, как я полагаю, они имеют).


Боковое примечание: как правило, вы хотите избегать использования параметров запроса в представлениях, так как это сочетание проблем (представление контроллера ‹->) и приведет к хрупкости и другим проблемам (как вы обнаружили). Скорее позвольте контроллеру собрать ваши ресурсы и назначить их переменным шаблона или тому, что у вас есть.

person numbers1311407    schedule 05.11.2013
comment
Огромное спасибо. Самым сложным в изучении Rails для меня было понять эти лучшие практики. Можете ли вы порекомендовать книги или другие ресурсы, объясняющие техники Rails, вытекающие из этих принципов? - person Duncan Malashock; 05.11.2013
comment
Я немного не в курсе, но официальные руководства всегда мне пригодятся. Кажется, здесь собрана многообещающая информация, . Две электронные книги под обучающими рельсами написаны одними из самых громких имен (и авторов исходного кода Rails) в сообществе и выглядят очень многообещающими. - person numbers1311407; 05.11.2013
comment
Я не пытаюсь зайти слишком далеко от ОТ, но я подумал, что учебник Хартла был отличным - как вы думаете, в чем заключаются проблемы? - person Duncan Malashock; 05.11.2013
comment
Ха-ха, я удалил это, потому что понял, что на самом деле у меня нет никаких веских причин. Мое единственное объяснение состоит в том, что я видел около 50 SO-вопросов от людей, сталкивающихся с проблемами, проходящими через это, но, по всей вероятности, проблемы следующие: PEBCAK и не имеет никакого отношения к руководству. - person numbers1311407; 05.11.2013