sql >> Databasteknik >  >> NoSQL >> MongoDB

RoR :Mongoid och form skapar hash

När du använder form_for :

I ditt fall, Video modell. För att förstå Rails-konventionen:

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

Vilket resulterar i en HTML-tagg vars namnattribut är video[beskrivning] . Detta innebär att när formuläret skickas kommer värdet som angetts av användaren att vara tillgängligt i kontrollern som params[:video][:beskrivning] .

params variabeln är en instans av ActiveSupport::HashWithIndifferentAccess , som en Hash med en liten skillnad, enligt dokumentation:

Dina params är något i stil med:

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

Där "video" eller :video är en av nycklarna till Hash. Så, params[:video] motsvarar params.fetch("video") vilket värde är {"description"=>"Video desc"} . Som du kan se är värdet en annan Hash. Slutligen för att få värdet av beskrivningen måste du params[:video][:description] (The Rails way) eller params.fetch("video").fetch("description") , vilket värde är "Video desc" .

fetch är en Ruby-metod för Hash :"Returnerar ett värde från hashen för den givna nyckeln."

Med hänsyn till detta:

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

Det är lättare att använda konventioner, men du kan säkert ha params[:description] (för säkerhets skull):

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

Observera att jag använder text_field_tag istället för f.text_field . I det här fallet kommer html-taggen att vara description i params Hash du kommer att få { "description" => 'Video desc" } ...

Ta en titt på Rails API-dokumentation för att förstå olika hjälpare etc. Och även granska din servers logg.



  1. Paginering på serversidan med enstaka dokumentsträngmatrisfält

  2. MongoDB -- stort antal databaser

  3. Resultaten för Mongo-projektionsfrågor varierar från testning i shell vs nodejs-applikation

  4. Problem med att köra OAuthd-instans