sql >> Database teknologi >  >> NoSQL >> MongoDB

RoR :Mongoid og form skaber hash

Når du bruger form_for :

I dit tilfælde Video model. Sådan forstår du Rails-konventionen:

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

Hvilket resulterer i et html-tag, hvis navneattribut er video[beskrivelse] . Det betyder, at når formularen indsendes, vil den værdi, som brugeren har indtastet, være tilgængelig i controlleren som parametre[:video][:beskrivelse] .

params variabel er en instace af ActiveSupport::HashWithIndifferentAccess , som en Hash med en lille forskel, ifølge dokumentation:

Dine params er noget i stil med:

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

Hvor "video" eller :video er en af ​​nøglerne til Hash. Så params[:video] svarer til params.fetch("video") hvilken værdi er {"description"=>"Video desc"} . Som du kan se er værdien en anden Hash. Til sidst for at få værdien af ​​beskrivelsen skal du params[:video][:description] (The Rails way) eller params.fetch("video").fetch("description") , hvilken værdi er "Video desc" .

fetch er en Ruby-metode til Hash :"Returnerer en værdi fra hashen for den givne nøgle."

Tager du dette i betragtning:

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

Det er nemmere at bruge konventioner, men du kan helt sikkert have params[:description] (bare for en sikkerheds skyld):

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

Bemærk, at jeg bruger text_field_tag i stedet for f.text_field . I dette tilfælde vil html-tagnavnet være description i params Hash vil du modtage { "description" => 'Video desc" } ...

Tag et kig på Rails API-dokumentation at forstå forskellige hjælpere osv. Og også gennemgå din servers log.



  1. mongodb, sortering efter geoNær og dato?

  2. Opdater model med Mongoose, Express, NodeJS

  3. Rails 3 ved hjælp af MongoDB via mongoid-adapter - er der nogen måde at dele attributspecifikationer på uden at bruge Single-Table Inheritance?

  4. kan ikke forespørge over ListField(EmbeddedDocumentField)