回报率:Mongoid和形式创建哈希(RoR : Mongoid and form create h

2019-10-18 13:55发布

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" />

Answer 1:

当您使用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标记名称将descriptionparams哈希,您将收到{ "description" => 'Video desc" } ...

看看到Rails的API文档 ,以了解不同佣工等,并且还检查服务器的日志。



Answer 2:

如果你想使用视频[:描述。 创建表单如

<%=  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]
    )


文章来源: RoR : Mongoid and form create hash