[英]How does Rails know which variable to take
通過遵循Mackenziechild.me的教程,可以在這里開始學習Rails。 例如,我創建了具有許多方法的PostController。 但是,令我困惑的是它們似乎具有相同的@post變量。 在這種情況下,程序實際上如何知道需要獲取哪個正確的變量? 他們不會在應用程序運行時感到困惑嗎?
class PostsController < ApplicationController
def index
@posts = Post.all.order('created_at DESC')
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post
else
render 'new'
end
end
def show
@post = Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title, :body)
end
end
在rails中index, new, show etc
作為get
方法的每個動作(如index, new, show etc
在相應的文件夾中都有其對應的視圖,稱為controller
名稱。
因此,當調用一個動作時,就會調用其特定的視圖。
例如:-
def index
@posts = Post.all.order('created_at DESC')
end
它們應該是app/views/posts/
文件夾中的index.html.erb
app/views/posts/
,在該視圖中,實例變量@posts
可以訪問。
在此行Post.all.order('created_at DESC')
, Post
模型查詢數據庫,並從表中獲取所有記錄作為posts
並以created _at
列的降序對記錄進行排序。
Post
模型繼承自ActiveRecord::Base
,因此它可以映射數據庫中的posts
表。
def show
@post = Post.find(params[:id])
end
在上述show
方法中,它僅查詢id為params[:id]
一條記錄。
實例變量可在視圖中訪問,因此在@post = Post.find(params[:id])
@post
可以在其對應的視圖中用作app/views/posts/
show.html.erb
。
Ikanyu, @post
變量是一個實例變量,即,其范圍僅限於其定義的方法。因此,新方法中定義的@post
變量與@post
定義的變量不同,因此可以在視圖沒有任何問題。
有關如何將這些變量傳遞到視圖中的更多信息,請參見以下鏈接:
我用很多方法創建了一個PostController。 但是,令我困惑的是它們似乎具有相同的@post變量。 在這種情況下,程序實際上如何知道需要獲取哪個正確的變量? 他們不會在應用程序運行時感到困惑嗎?
當瀏覽器請求頁面時,請求將路由到您定義的方法之一。 該方法執行,該方法設置@post的值。 將響應發送到瀏覽器后,rails破壞所有已創建的變量。
但是我們有Post.new,Post.new(post_params),Post.find(params [:id])我來自Java背景。 所以這讓我很困惑。 它們都被分配到相同的@post
在Java中,您當然可以將三件事分配給同一變量:
int x = 1;
x = 2;
x = 3;
System.out.println(x); #=>3
而且,如果您有一個名為Post的類,則還可以將三個不同的Post對象分配給同一變量:
Post p = new Post("hello");
System.out.println(p.getText());
p = new Post("world");
System.out.println(p.getText());
p = new Post("goodbye");
System.out.println(p.getText()); #=>goodbye
Post.new
, Post.new(post_params)
和Post.find(params[:id])
一個都返回一個Post對象; 另外,它們被分配給相同的變量,那么為什么您對Java來的變量感到困惑呢?
但是,您還應該注意,Rails在幕后使用了一種稱為ruby的語言,並且在ruby中變量沒有類型,也不必聲明。 因此,在ruby中,您可以為同一變量分配不同的類型:
some_var = "hello" #String
some_var = 10 #Integer
some_var = [1, 2, 3] #Array
some_var = {a: 1, b: 2} #Hash
如果您說自己被類似的東西弄糊塗了,那將更有意義。 但是,即使如此,還有什么讓我感到困惑的呢? 有兩個簡單的規則:
之前,我這樣說:
當瀏覽器請求頁面時,請求將路由到您定義的方法之一。 該方法執行,該方法設置@post的值。 將響應發送到瀏覽器后,rails破壞所有已創建的變量。
在內部,工作方式是:
當將URL路由到某個控制器時,rails會創建該控制器類的實例:
obj = PostsController.new
Rails使用控制器實例來調用在控制器類中定義的方法之一(該方法由路由確定):
obj.show
(就像在Java中一樣,當方法的名稱為String時,有多種方法可以調用方法-在ruby中它要容易得多。)
該方法執行。
響應發送到瀏覽器后,rails破壞控制器實例:
obj = nil
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.