Rails: Как мне отправить объект вместе с формой? - PullRequest
2 голосов
/ 22 декабря 2009

У меня есть Post объект модели, который имеет ссылку на родительский объект. Все методы edit, new и reply используют один и тот же частичный шаблон.

Методы posts_controller:

def edit
  @post = Post.find(params[:id])
end

def reply
  @post = Post.new
  @replypost = Post.find(params[:id])
  @post.title = @replypost.title
  @post.parent = @replypost
end

Частичный код шаблона:

<% form_for(@post) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>
  <p>
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </p>
  <%= if :parent then f.hidden_field :parent end %>
  <p>
    <%= f.submit "Create" %>
  </p>
<% end %>

Если я посмотрю на исходный HTML-код, сгенерированный частичным шаблоном, то увижу, что я передаю некоторый вид идентификатора объекта моему методу создания.

<input id="post_parent" name="post[parent]" type="hidden" value="#&lt;Post:0x103e3bdf0&gt;" />

Проблема в том, что когда я пытаюсь сохранить созданный мною новый объект, я получаю предупреждение о том, что он ожидает публикацию и получает строку. Я уверен, что смогу обойти это, установив и получив parent_id и передав его в моей форме, но мне интересно, нет ли лучшего способа сделать это, что-то более элегантное и Rails-esque.

Ответы [ 3 ]

5 голосов
/ 22 декабря 2009

попробуй <%= f.hidden_field :parent_id unless @post.parent.nil? %>

Это передаст родительский идентификатор вместе с сообщением, и вы можете .find(params[:post][:parent_id]), если вам понадобится объект позже.

2 голосов
/ 28 сентября 2011

Для людей, которые хотят отправить объект вместо идентификатора (полезно, когда у вас есть несохраненный объект), вы можете сделать следующее:

На ваш взгляд:

<% form_for(@post) do |f| %>
  ...
  <%= hidden_field_tag :param_name, @object.to_param %>

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

object = Rack::Utils.parse_nested_query params[:param_name]

Работает для вложенных хэшей. Не тестировался с массивами или хэшами массивов.

Я нашел это необходимым при создании объекта в нескольких представлениях, которые не прошли бы проверку, если бы я попытался сохранить ранее.

Предупреждение : данные в @object видны пользователю в hidden_field_tag. Им просто нужно нажать «просмотреть источник». Тщательно продумайте все объекты, которые вы хотите сериализовать этим методом.

1 голос
/ 22 декабря 2009

Из того, как это выглядит,

<%= if :parent then f.hidden_field :parent end %>

не может сделать вывод, что когда вы говорите: parent, вы хотите, чтобы значением скрытого поля был идентификатор родительского сообщения.

Вы должны явно использовать: parent_id для генерации значения скрытого поля, потому что оно не может быть выведено, как в других местах Rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...