Rails的大师简单的问题。 为什么我必须使用下面的语句来插入一个新Mongoid文件:PARAMS [:视频] [:描述]我VideosController以下create方法? 为什么我不能使用PARAMS:从POST形式[说明]? 如果我使用它,值变为零。
def create
@video = Video.new(
:title => params[:video][:title],
:description => params[:video][:description]
)
if @video.save
render 'success'
else
render 'error'
end
end
这里是Video.rb类:
class Video
include Mongoid::Document
field :title, type: String
field :description, type: String
validates_presence_of :title
validates_presence_of :description
acts_as_url :title
end
而finaly表单视图:
<%= form_for @video do |f| %>
<%= f.label :title %>
<%= f.text_field :title %>
<p/>
<%= f.label :description %>
<%= f.text_field :description %>
<%= submit_tag("Enqueue video") %>
<% end %>
我不太明白为什么表单输入的视频[说明]并没有像预期只是说明:
<label for="video_title">Title</label>
<input id="video_title" name="video[title]" type="text" />
<p/>
<label for="video_description">Description</label>
<input id="video_description" name="video[description]" type="text" />
当您使用form_for
:
创建一个形式,其允许用户创建或更新特定模型对象的属性。
在你的情况, Video
模式。 要了解Rails约定:
<%= form_for @video do |f| %>
...
<%= f.text_field :description %>
...
这导致了一个HTML标签的名字属性是视频[说明]。 这意味着,当表单提交时,由用户输入的值将在控制器可作为PARAMS [:视频] [:描述]。
所述params
变量是一个instace ActiveSupport::HashWithIndifferentAccess
,就像一个Hash
具有小的差别,根据文档:
这个类有可疑的语义,我们只有它使人们可以写PARAMS [:键],而不是PARAMS [“关键”],他们得到了这两个键的值相同。
你params
是一样的东西:
{"utf8"=>"✓",
"_method"=>"post",
"authenticity_token"=>"xxx",
"video"=>
{"description"=>"Video desc"}
}
当"video"
或:video
是哈希的关键之一。 所以, params[:video]
等同于params.fetch("video")
其值是{"description"=>"Video desc"}
。 正如你所看到的值是另一个哈希。 最后让你不得不说明的值params[:video][:description]
(Rails的方式)或params.fetch("video").fetch("description")
其值是"Video desc"
。
fetch
是一个Ruby方法Hash
:“返回从哈希给定键的值。”
考虑到这一点:
Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])
它更容易使用的约定,但是可以肯定,你可以有params[:description]
(以防万一):
<%= form_for @video do |f| %>
...
<%= text_field_tag :description %>
...
请注意,我用text_field_tag
代替f.text_field
。 在这种情况下,HTML标记名称将description
在params
哈希,您将收到{ "description" => 'Video desc" }
...
看看到Rails的API文档 ,以了解不同佣工等,并且还检查服务器的日志。
如果你想使用视频[:描述。 创建表单如
<%= form_for @video do |f| %>
....
<p/>
<%= f.label :description %>
<%= f.text_field :description, :name => "description" %>
....
<% end %>
导轨的form_for助手名输入元素,使得它变得容易将它们推到模型一气呵成这样的属性
@video = Video.new(params[:video])
这样你就不必做你喜欢这样做的方式
@video = Video.new(
:title => params[:video][:title],
:description => params[:video][:description]
)