繁体   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