簡體   English   中英

Rails如何知道采用哪個變量

[英]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定義的變量不同,因此可以在視圖沒有任何問題。

有關如何將這些變量傳遞到視圖中的更多信息,請參見以下鏈接:

Rails實例變量如何傳遞給視圖?

我用很多方法創建了一個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.newPost.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

如果您說自己被類似的東西弄糊塗了,那將更有意義。 但是,即使如此,還有什么讓我感到困惑的呢? 有兩個簡單的規則:

  1. 變量名稱沒有類型。
  2. 因此,您不必聲明變量。

之前,我這樣說:

當瀏覽器請求頁面時,請求將路由到您定義的方法之一。 該方法執行,該方法設置@post的值。 將響應發送到瀏覽器后,rails破壞所有已創建的變量。

在內部,工作方式是:

  1. 當將URL路由到某個控制器時,rails會創建該控制器類的實例:

    obj = PostsController.new

  2. Rails使用控制器實例來調用在控制器類中定義的方法之一(該方法由路由確定):

    obj.show

(就像在Java中一樣,當方法的名稱為String時,有多種方法可以調用方法-在ruby中它要容易得多。)

  1. 該方法執行。

  2. 響應發送到瀏覽器后,rails破壞控制器實例:

    obj = nil

暫無
暫無

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

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