我正在尝试使用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;期望一个属性哈希,得到零
有人知道为什么吗?谢谢你的帮助。
答案 0 :(得分:1)
答案 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) do
:form_tag用于与任何模型无关的简单表单。你可以在form_tag中命名这些标签,使它们类似于form,但是为什么你不直接使用form_for。显然,帮助器的第一个参数是目标url,在这种特殊情况下,rails会从@user
神奇地识别网址并且你没有注意到任何错误form_for(@user) do |f|
:form_for用于为模型创建表单,并将表单与传递给它的模型实例绑定在一起。 form_for的块接收form_builder对象,其text_field_tag
,label_tag
等等text_field
,label
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输入的字段值相关联,即您获得与标签相同的错误功能,并且您还可以使用模型实例中的值字段自动预填充输入。