2015-02-08 45 views
1

通過mackenziechild.me的後續教程,可以瞭解Rails的初學者。例如,我用很多方法創建了一個PostController。然而,讓我困惑的是他們似乎擁有相同的變量@post。在這種情況下,程序如何知道它需要獲得哪個正確的變量?當應用程序運行時,他們不會感到困惑嗎?Rails如何知道要使用哪個變量

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 
+0

不知道你是問什麼,所有的'@ POST'變量是同一個變量。 – 2015-02-08 08:10:46

+0

但我們有Post.new,Post.new(post_params),Post.find(params [:id]) 我來自Java背景。所以這讓我很困惑。他們所有的區域都被分配到同一個@post。 3個相同的變量名稱,但有3個不同的功能。你介意給我解釋一下嗎? – ikanyu 2015-02-08 08:17:45

回答

0

使用我已創建有很多方法的PostController中。不過, 讓我困惑的是他們似乎有相同的變量@post。在這個 的情況下,程序如何知道它需要得到哪個正確的變量?當應用程序 正在運行時,他們難道不會感到困惑嗎?

當瀏覽器請求一個頁面時,請求會被路由到您定義的一種方法。該方法執行,並且該方法設置@post的值。將響應發送到瀏覽器後,rails會銷燬所有已創建的變量。

但我們有Post。新的,Post.new(post_params),Post.find(params [:id])I 來自Java背景。所以這讓我很困惑。他們區 都被分配到相同的@post

在Java中,你當然可以指定三件事同一個變量:

int x = 1; 
x = 2; 
x = 3; 
System.out.println(x); #=>3 

而且,如果你有一個名爲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被路由到某個控制器,軌創建控制器類的一個實例:

    obj = PostsController.new

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

    obj.show

(就像在Java中,有一些方法可以調用一個方法時,你有方法作爲字符串的名稱 - 它在Ruby的要容易得多。)

  1. 該方法執行。響應發送到瀏覽器

  2. 後,鐵軌破壞控制器實例:

    obj = nil

+0

感謝您的解釋,並肩比較ror和java!你們真的很有幫助:)希望有一天,我可以像你們一樣在編程方面做得很好,還有更多要學習,我會繼續努力!感謝,並有一個愉快的一天 – ikanyu 2015-02-08 12:31:45

0

Ikanyu,所述@post變量是一個實例變量即,其範圍僅限於它是在定義的方法。因此,在新的方法中定義的@post變量是從在顯示中定義的一個不同的,因此這些不同的在視圖中訪問變量沒有任何問題。

對於以這些變量是如何傳遞到視圖參考此鏈接的詳細信息:

How are Rails instance variables passed to views?

2

在軌像index, new, show etc每個動作這是一個get方法在命名相應的文件夾及其相應的意見作爲controller的名稱。

所以當一個動作被調用時,他們的特定視圖被調用。

如: -

def index 
    @posts = Post.all.order('created_at DESC') 
end 

他們應該是一個視圖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可以在其作爲show.html.erb相應視圖在app/views/posts/

+0

謝謝謝謝謝謝!!!!!真的清除了我對這些變量的懷疑。 :) 再一次感謝你! – ikanyu 2015-02-08 08:41:36

相關問題