2013-08-25 20 views
0

爲Rails大師簡單的問題。爲什麼我必須使用下面的語句來插入一個新Mongoid文件:PARAMS [:視頻] [:描述]我VideosController以下create方法?爲什麼我不能使用POST表單中的params [:description]?如果我使用它,價值變成零。回報率:Mongoid和形式創建哈希

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

回答

3

的方式當您使用form_for

創建一個形式,其允許用戶創建或更新屬性的特定模型對象的 。

在你的情況下,Video模型。要了解Rails約定:

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

導致HTML標籤的名字屬性爲視頻[說明]。這意味着,當表單提交時,由用戶輸入的值將在控制器爲PARAMS可用[:視頻] [:描述]

params變量是ActiveSupport::HashWithIndifferentAccess的instace,像一個小的差異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是一個紅寶石方法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 documentation瞭解不同傭工等,並且還檢查服務器的日誌。

0

I如果你想使用視頻[:描述]。創建表單如

<%= form_for @video do |f| %> 

    .... 

    <p/> 

    <%= f.label :description %> 
    <%= f.text_field :description, :name => "description" %> 

    .... 

<% end %> 

的Rails的form_for助手名輸入元素,使得它變得容易將它們推入模型屬性一氣呵成這樣

@video = Video.new(params[:video]) 

,這樣你就不必做你喜歡做了

@video = Video.new(
     :title => params[:video][:title], 
     :description => params[:video][:description] 
    ) 
+1

在模型不關心的'params'(例如':action',該按鈕被按下......)的頂層也會有一堆東西。 –