ActiveResource, модель и Form_Tag

Я пытаюсь использовать form_tag для передачи параметров, захваченных формой, моему пользовательскому контроллеру. Я пытаюсь связаться с сервером Sinatra, поэтому у меня нет базы данных на клиенте. Моя точка зрения такова:

 <% form_tag(@user) do %>

<div class="field">
<%= label_tag :first_mame %><br />
<%= text_field_tag :first_name  %>
</div>
<div class="field">
<%= label_tag :last_name %><br />
<%= text_field_tag :last_name %>
</div>
<div class="field">
<%= label_tag :email %><br />
<%= text_field_tag "user[email]" %>
</div>
<div class="field">
  <%= label_tag :device_id %><br />
  <%= text_field_tag "user[device_id]" %>
</div>
<div class="field">
<%= label_tag :type %><br />
<%= text_field_tag "user[device_type]" %>
</div>
<div class="actions">
<%= submit_tag %>
 </div>
<% end %>

Действие создания на моем контроллере просто:

 def create
 @user = User.new(params[@user])
 @user.save

respond_to do |format|
  if @user.save
    format.html { redirect_to(@user, :notice => 'User was successfully created.') }
    format.json {render :json => @user }
    format.xml  { render :xml => @user, :status => :created, :location => @user }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
  end
end

конец

Вот что я получаю в результате => ожидал хеш атрибутов, получил ноль

Кто-нибудь знает, почему? Спасибо за помощь.


person Lior    schedule 21.07.2011    source источник
comment
Обновил детали, надеюсь прояснил почти все.   -  person rubish    schedule 22.07.2011


Ответы (2)


  1. Вам нужно использовать form_for, а не form_tag. form_for(@user) делать
  2. В вашей модели вам нужно создать схему. Без него Rails не знает, что делать с данными, которые вы вводите в форму.
  3. Когда вы передаете объект в хэш параметра, используйте :user, а не @user. @user = User.new (параметры [: пользователь])
person Scott    schedule 28.07.2011
comment
Ага. Когда я делаю user.save с этим, он работает. Параметры переданы правильно. - person Lior; 29.07.2011

Для вашей формы вам нужно сделать

<%= form_for @user do |f| %>
  <div class="field">
    <%= f.label :first_name %>
    <%= f.text_field :first_name %>
  </div>

  # more fields
<% end %>

Обратите внимание:

  • <% %> --> <%= %>
  • form_tag(@user) do --> form_for(@user) do |f|
  • label_tag --> f.label
  • text_field_tag --> f.text_field

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

@user = User.new(params[:user])

Обновление:

  • <% %> --> <%= %>: это просто соглашение в rails3, когда вы хотите написать что-то в ответе, который вы должны использовать позже (со знаком =). Ранее все еще работает, но устарело.

  • form_tag(@user) do --> form_for(@user) do |f|

    • form_tag(@user) do: form_tag is used to for simple forms which are not tied with any model. You can have the tags inside form_tag named so that they resemble form for, but then why wouldn't you use form_for directly. Apparently the first parameter to the helper is target url, and in this particular case rails magically identifies the url from @user and you didn't notice any bug
    • form_for(@user) do |f|: form_for используется для создания формы для модели и связывает форму с переданным ей экземпляром модели. Блок для form_for получает объект form_builder, который имеет эквиваленты text_field_tag, label_tag и т. д. как text_field, label
  • label_tag --> f.label: первый - это общий тег, который просто создает тег метки без какой-либо магии, связанной с ним. Последний связан с объектом модели и следует другим соглашениям об именах и идентификаторах, чем предыдущий. Это также связано со значением поля, т. Е. Если в поле есть ошибка (сбой проверки), ваша метка будет окружена тегом div с классом fields_with_error или чем-то еще, я не могу вспомнить имя класса.

  • text_field_tag --> f.text_field: Первый создаст поле с именем first_name без какой-либо магии. Позже следует соглашение об именах, поле ввода будет называться user[first_name], поэтому, когда вы делаете params[:user], вы получаете там параметр first_name. Это также связано со значением поля с вводом html, т. Е. Вы получаете ту же функциональность ошибки, что и метка, и вы также получаете ввод, автоматически предварительно заполненный тем, что поле значения имеет в экземпляре модели.

person rubish    schedule 21.07.2011
comment
Не могли бы вы рассказать подробнее и объяснить, почему эти изменения необходимы, пожалуйста? - person Ryan Bigg; 22.07.2011
comment
Спасибо за ответ. Я пробовал form_for раньше, как вы описали выше, но форма предварительно заполняется «{}», а хэш параметров, связанный с моделью, помещает весь хеш в каждый ключ. Например, :first_name =› {:first_name . . . :фамилия . . .:электронное письмо . . . и т.д). Ключ last_name, ключ электронной почты и т. д. имеют один и тот же хэш внутри при использовании form_for для захвата параметров. Это происходит только с ActiveResource. Что ты посоветуешь? Кстати, спасибо за ваш отзыв. - person Lior; 22.07.2011
comment
По-видимому, это связано с тем, что params[:user] с активным ресурсом сбрасывает все в большой массив. Мне нужно иметь возможность сгладить массив и преобразовать его в хэш, чтобы можно было извлечь только те ключи и информацию, которые мне нужны, чтобы они хорошо работали с Json. - person Lior; 23.07.2011
comment
Собираюсь задать еще один вопрос, потому что мне удалось получить атрибуты в хэш, но я не могу сохранить хеш. @рубиш - person Lior; 23.07.2011
comment
Вы можете опубликовать параметры, которые вы получаете? - person rubish; 23.07.2011
comment
Вот ответ консоли, когда я создаю нового пользователя:#‹Пользователь:0x00000100d6a6b8 #@attributes={first_name=›stop, last_name=›eating, email=›your, device_id=›feet, device_type=›sisi}, #@ prefix_options={}› , но когда Синатра видит это, когда я пытаюсь сохранить объект, он видит только ноль. Итак, я подумал, что смогу превратить его в хеш, который сможет понять JSon. Судя по всему, я не могу сохранить хэш (я новичок в Ruby). PS, # в приведенном выше коде просто для того, чтобы я не получал сообщения об ошибках, публикуемых в этом ответе относительно автора сообщения. @Rubish - person Lior; 23.07.2011