рельсы - что именно делают hidden_field и hidden_field_tag? - PullRequest
16 голосов
/ 12 октября 2011

Я прочитал четкое определение hidden_fields, но не уверен, что он действительно делает.Насколько я понимаю, это позволяет вам передавать атрибут для определенных параметров.Например, если у вас модель расширенного объединения, вы можете использовать hidden_field, чтобы присвоить user_id атрибуту модели объединения для пользователя.Это правильно?

Если да, то лучше ли сделать это в форме или в контроллере?

Ответы [ 2 ]

34 голосов
/ 12 октября 2011

Оба эти метода являются вспомогательными для создания тега ввода HTML типа «скрытый», и да, они используются для добавления параметров в запрос (обычно это форма POST).Действительно, параметром может быть любая часть информации, которую вы хотите отправить вместе с запросом.Будьте осторожны, так как скрытые поля легко подделать.

Вот пример, который отправит идентификатор пользователя в скрытое поле

# Form
<%= form_tag foo_path do %>
  <%= hidden_field_tag "user_id", @user.id %>
  ....
  <%= submit_tag "Click Me" %>
<% end %>

# Controller
def foo
  # params[:user_id] is set with the value from the hidden field
  # Do useful stuff with the POST data
end

В то время как вы можете передавать такие вещи, как user_id какэто, я считаю, что необходимость в этом редко.Если user_id всегда требуется для данной ситуации, вы можете рассмотреть возможность использования вложенных маршрутов http://guides.rubyonrails.org/routing.html#nested-resources.

10 голосов
/ 12 октября 2011

Будет генерироваться скрытый тип поля ввода ...

<input type="hidden" />

Это способ хранения информации, которую вы хотите отправить с формой, без необходимости иметь видимое поле.

Из документации :

hidden_field_tag 'tags_list' генерирует ...
<input id="tags_list" name="tags_list" type="hidden" />

hidden_field_tag предназначен для использования без модели, тогда как hidden_field предназначен для использования вместе с вызовом form_for и моделью.

hidden_field(:signup, :pass_confirm) генерирует ...
<input type="hidden" id="signup_pass_confirm" name="signup[pass_confirm]" value="#{@signup.pass_confirm}" />

...