MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

RoR:Mongoid und Form erzeugen Hash

Wenn Sie form_for verwenden :

In Ihrem Fall Video Modell. So verstehen Sie die Rails-Konvention:

<%=  form_for @video do |f| %>
...
<%= f.text_field :description %>
...

Was zu einem HTML-Tag führt, dessen Namensattribut video[description] ist . Das bedeutet, dass beim Absenden des Formulars der vom Benutzer eingegebene Wert im Controller als params[:video][:description] verfügbar ist .

Die params Variable ist eine Instanz von ActiveSupport::HashWithIndifferentAccess , wie ein Hash mit einem kleinen Unterschied, laut Dokumentation:

Ihre params ist so etwas wie:

{"utf8"=>"✓",
 "_method"=>"post",
 "authenticity_token"=>"xxx",
 "video"=>
  {"description"=>"Video desc"}
}

Wobei "video" oder :video ist einer der Schlüssel des Hash. Also params[:video] entspricht params.fetch("video") welcher Wert ist {"description"=>"Video desc"} . Wie Sie sehen können, ist der Wert ein weiterer Hash. Um schließlich den Wert der Beschreibung zu erhalten, müssen Sie params[:video][:description] eingeben (The Rails way) oder params.fetch("video").fetch("description") , dessen Wert "Video desc" ist .

fetch ist eine Ruby-Methode von Hash :"Gibt einen Wert aus dem Hash für den angegebenen Schlüssel zurück."

Unter Berücksichtigung dessen:

Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])

Es ist einfacher, Konventionen zu verwenden, aber Sie können sicher params[:description] verwenden (nur für den Fall):

<%=  form_for @video do |f| %>
...
<%= text_field_tag :description %>
...

Beachten Sie, dass ich text_field_tag verwende statt f.text_field . In diesem Fall lautet der Name des HTML-Tags description in den params Hash erhalten Sie { "description" => 'Video desc" } ...

Sehen Sie sich die Rails-API-Dokumentation an um verschiedene Helfer zu verstehen usw. Und überprüfen Sie auch das Protokoll Ihres Servers.