簡體   English   中英

Rails:參數如何在控制器中工作?

[英]Rails: how do params work in controller?

我想知道參數如何在Rails中工作。 所以我有一個問題控制器。 新的第一個動作意味着我需要為模型調用create new函數問對嗎? 但是一旦進入創建階段,我就會有些困惑。 new(params [:question])為我們帶來了什么? 而且在節目中,通過params [:id]查找有什么作用? 我相信參數是由視圖中存儲的信息發送的嗎? def new @question = Question.new結束

def create
    @question = Question.new(params[:question])
    if @question.save
        redirect_to @question
    else
        render 'new'
    end
end

def show
    @question = Question.find(params[:id])
end

What does the new(params[:question]) get for us?

當您按下諸如“ submit按鈕之類的命令時,將創建一個創建動作。 然后,該表格通過參數發送到您的控制器。 然后,您的控制器將創建一個新對象。 基本上,新的東西只是制造一個可以放東西的容器。 那東西就是參數。

in the show, what does finding by params[:id] do?

在節目中,您正在模型上調用.find。 模型是控制器中的大寫單詞。 模型與您的數據庫進行交互。 當您調用find(這是一個有效的記錄方法)時,模型將進入數據庫並提取信息。 在這種情況下,它會提取ID與您的參數中的ID匹配的信息。 這些參數來自哪里? 在這種情況下,參數來自URL。 show動作的URL類似於exmaple.com/stuff/1因此在此示例中,id = 1,params [:id] = 1

我認為您可能會發現有幫助的幾點是:

  1. 控制器中定義的動作順序並不重要。 因此,第一個動作可以是任何東西,可以是newshow或您可以定義的一些自定義動作。
  2. 在執行Question.newnew操作中,它將使用默認值初始化一個新的question實例。
  3. 在執行Question.new(params[:question])create動作中,它將初始化一個新的Question實例,該實例從params哈希中分配屬性值,這些值通過“質量分配”來允許。 因此, @question現在擁有一個Question實例,該實例的值由用戶提供,並由params哈希值保存。

在訪問諸如/questions/1類的URL時執行的show action中,除非您在config/routes.rb配置中特別指定了其他屬性,否則1通常是id 如果您從終端或命令提示符處檢查rake routes的輸出,則會看到以下行:

question GET    /questions/:id(.:format)          questions#show

這行的意思是,對於任何URL模式/questions/:id(.:format) ,其中:id是資源ID,在這種情況下,問題id具有可選的參數格式,請執行questions控制器的show操作。 這個idformat由Rails包含在params哈希中,可以通過params[:id]params[:format]

因此, @question = Question.find(params[:id])表示URL路徑/questions/1 Question.find(1)

我發現,考慮到這一點的最佳方法是使用良好的舊命令行。

irb(main):001:0> Thing.new
=> #<Thing id: nil, name: nil, description: nil, url: nil, image: nil, created_at: nil, updated_at: nil>

現在,當您將屬性的參數傳遞給Thing.new時會發生什么?

irb(main):002:0> Thing.new(:name => 'Foo')
=> #<Thing id: nil, name: "Foo", description: nil, url: nil, image: nil, created_at: nil, updated_at: nil>

那么,什么是參數呢? 好吧,在params [:question]中,您正在傳遞屬性的哈希。 所以說真的,您正在做我上面所做的事情。 現在...在這里的東西上...我已經進行了驗證,可以防止僅用名稱保存東西...所以如果我嘗試保存...我會得到錯誤的結果。

irb(main):004:0> thing = Thing.new(:name => 'Foo')
=> #<Thing id: nil, name: "Foo", description: nil, url: nil, image: nil, created_at: nil, updated_at: nil>
irb(main):005:0> thing.save
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
=> false

這就是為什么有if @ question.save分支的原因

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM