Rails如何知道要采用哪个变量

时间:2015-02-08 08:07:19

标签: ruby-on-rails ruby variables

通过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

3 个答案:

答案 0 :(得分:2)

在rails中,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/对应的视图中使用

答案 1 :(得分:0)

Ikanyu,@post变量是一个实例变量,即它的范围仅限于它定义的方法。因此,新方法中定义的@post变量与show中定义的变量不同。因此,在视图中访问这些不同的变量没有任何问题。

有关如何将这些变量传递到视图的更多信息,请参阅以下链接:

How are Rails instance variables passed to views?

答案 2 :(得分:0)

  

我创建了一个包含大量方法的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. 因此,您不必声明变量。
  3. 早些时候,我说过:

      

    当您的浏览器请求页面时,请求将被路由到其中一个页面   您定义的方法。该方法执行,该方法设置   @post的价值。将响应发送到浏览器后,rails   销毁所有创建的变量。

    在内部,工作方式是:

    1. 当网址路由到某个控制器时,rails会创建该控制器类的实例:

      obj = PostsController.new

    2. Rails使用控制器实例调用控制器类中定义的方法之一(该方法由路由确定):

      obj.show

    3. (就像在Java中一样,当你将方法的名称作为String时,有一些方法可以调用方法 - 而且在ruby中它更容易。)

      1. 该方法执行。

      2. 将响应发送到浏览器后,rails会破坏控制器实例:

        obj = nil