[英]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
我認為您可能會發現有幫助的幾點是:
new
, show
或您可以定義的一些自定義動作。 Question.new
的new
操作中,它將使用默認值初始化一個新的question實例。 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
操作。 這個id
和format
由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.