ActiveResource, модель и Form_Tag - PullRequest
       16

ActiveResource, модель и Form_Tag

1 голос
/ 22 июля 2011

Я пытаюсь использовать 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

конец

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

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

Ответы [ 2 ]

1 голос
/ 29 июля 2011
  1. Вам нужно использовать form_for, а не form_tag. form_for (@user) do
  2. В вашей модели вам нужно создать схему. Без этого Rails не знает, что делать с данными, которые вы вводите в форму.
  3. Когда вы передаете объект в хеш параметра, используйте: user, а не @user. @user = User.new (params [: user])
0 голосов
/ 22 июля 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 используетсядля простых форм, которые не связаны ни с одной моделью.Теги внутри form_tag могут быть названы так, чтобы они напоминали форму, но почему бы вам не использовать form_for напрямую.По-видимому, первым параметром для помощника является целевой URL-адрес, и в этом конкретном случае рельсы волшебным образом идентифицируют URL-адрес из @user, и вы не заметили никакой ошибки
    • 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, то есть вы получаете ту же функциональность ошибок, что и метка, и вы также автоматически заполняете ввод любым значением поля в экземпляре модели.

...