MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

RoR:Mongoid e formulário criam hash


Quando você está usando form_for :

No seu caso, Video modelo. Para entender a convenção do Rails:
<%=  form_for @video do |f| %>
...
<%= f.text_field :description %>
...

O que resulta em uma tag html cujo atributo name é video[description] . Isso significa que quando o formulário for enviado, o valor inserido pelo usuário estará disponível no controlador como params[:video][:description] .

Os params variável é uma instância de ActiveSupport::HashWithIndifferentAccess , como um Hash com uma pequena diferença, de acordo com a documentação:

Seus params é algo como:
{"utf8"=>"✓",
 "_method"=>"post",
 "authenticity_token"=>"xxx",
 "video"=>
  {"description"=>"Video desc"}
}

Onde "video" ou :video é uma das chaves do Hash. Então, params[:video] é equivalente a params.fetch("video") qual valor é {"description"=>"Video desc"} . Como você pode ver o valor é outro Hash. Finalmente, para obter o valor da descrição, você deve params[:video][:description] (A maneira Rails) ou params.fetch("video").fetch("description") , cujo valor é "Video desc" .

fetch é um método Ruby de Hash :"Retorna um valor do hash para a chave fornecida."

Levando isso em consideração:
Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])

É mais fácil usar convenções, mas com certeza você pode ter params[:description] (apenas no caso de):
<%=  form_for @video do |f| %>
...
<%= text_field_tag :description %>
...

Observe que estou usando text_field_tag em vez de f.text_field . Neste caso, o nome da tag html será description nos params Hash você receberá { "description" => 'Video desc" } ...

Dê uma olhada na documentação da API Rails para entender diferentes ajudantes, etc. E também revisar o log do seu servidor.