ActiveResource,模型和Form_Tag

时间:2011-07-21 22:49:01

标签: ruby-on-rails-3 forms activeresource

我正在尝试使用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

结束

这是我得到的结果=&gt;期望一个属性哈希,得到零

有人知道为什么吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

  1. 您需要使用form_for而不是form_tag。 form_for(@user)do
  2. 在您的模型中,您需要创建架构。没有它,Rails不知道你在表单中输入的数据是什么。
  3. 将对象传递给参数hash时,使用:user而不是@user。 @user = User.new(params [:user])

答案 1 :(得分:0)

您需要做的表格

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

  # more fields
<% end %>

请注意:

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

在你的控制器中:

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

<强>更新

  • <% %> - &gt; <%= %>:这只是rails3中的约定,当你想要在稍后使用的响应中写一些内容时(使用=符号)。之前仍然有效,但已被弃用。

  • form_tag(@user) do - &gt; form_for(@user) do |f|

    • form_tag(@user) doform_tag用于与任何模型无关的简单表单。你可以在form_tag中命名这些标签,使它们类似于form,但是为什么你不直接使用form_for。显然,帮助器的第一个参数是目标url,在这种特殊情况下,rails会从@user神奇地识别网址并且你没有注意到任何错误
    • form_for(@user) do |f|form_for用于为模型创建表单,并将表单与传递给它的模型实例绑定在一起。 form_for的块接收form_builder对象,其text_field_taglabel_tag等等text_fieldlabel
  • label_tag - &gt; f.label:首先是公共标记,它只创建一个没有附加魔法的标签标记。后面与模型对象相关,遵循不同的命名和id约定,而不是前者。它还与字段的值绑定,即如果字段有错误(验证失败),您的标签将被一个带有类fields_with_error的div标签包围,我不记得类名

  • text_field_tag - &gt; f.text_field:前者将创建一个名称为first_name但未附加魔法的字段。后面的命名约定遵循命名约定,输入字段将命名为user[first_name],因此当您执行params[:user]时,您将获得first_name参数。它还与html输入的字段值相关联,即您获得与标签相同的错误功能,并且您还可以使用模型实例中的值字段自动预填充输入。