Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails如何知道使用哪个变量_Ruby On Rails_Ruby_Variables - Fatal编程技术网

Ruby on rails Rails如何知道使用哪个变量

Ruby on rails Rails如何知道使用哪个变量,ruby-on-rails,ruby,variables,Ruby On Rails,Ruby,Variables,下面是mackenziechild.me的教程,这是Rails的初学者。例如,我用许多方法创建了一个PostController。然而,让我困惑的是,它们似乎有相同的变量@post。在这种情况下,程序实际上如何知道需要获取哪个正确的变量?当应用程序运行时,他们不会感到困惑吗 class PostsController < ApplicationController def index @posts = Post.all.order('created_at DESC'

下面是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
class PostsController
Ikanyu,
@post
变量是一个实例变量,即其范围仅限于在中定义的方法。因此,新方法中定义的
@post
变量与show中定义的变量不同,因此在视图中访问这些不同的变量时不会出现任何问题

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


在rails中,像
索引、新建、显示等
这样的
get
方法的每个操作在名为
控制器
名称的相应文件夹中都有相应的视图

因此,当一个动作被调用时,他们的特定视图就会被调用

例如:-

它们应该是文件夹
app/views/posts/
中的
index.html.erb
视图,在该视图中可以访问实例变量
@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
in
app/views/posts/

我已经用很多方法创建了一个PostController。但是,什么? 让我困惑的是,他们似乎有相同的变量@post。在这个 在这种情况下,程序如何真正知道它使用的是哪个正确的变量 需要得到什么?当应用程序启动时,他们不会感到困惑吗 跑步

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


但是我们有Post.new,Post.new(Post_参数),Post.find(参数[:id])I 来自Java背景。这让我很困惑。他们的区域 所有人都被分配到同一个@post

在Java中,您当然可以为同一个变量分配三件事:

int x = 1;
x = 2;
x = 3;
System.out.println(x);  #=>3
    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
some_var = "hello"  #String
some_var = 10  #Integer
some_var = [1, 2, 3]  #Array
some_var = {a: 1, b: 2}  #Hash
而且,如果您有一个名为Post的类,您还可以将三个不同的Post对象指定给同一个变量:

int x = 1;
x = 2;
x = 3;
System.out.println(x);  #=>3
    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
some_var = "hello"  #String
some_var = 10  #Integer
some_var = [1, 2, 3]  #Array
some_var = {a: 1, b: 2}  #Hash
Post.new
Post.new(Post_参数)
Post.find(params[:id])
返回一个Post对象;此外,它们被分配给同一个变量,那么为什么您会对来自Java背景的变量感到困惑呢

但是,您还应该注意,Rails使用了一种叫做ruby的语言,在ruby中,变量没有类型,也不需要声明。因此,在ruby中,您可以为同一个变量分配不同的类型:

int x = 1;
x = 2;
x = 3;
System.out.println(x);  #=>3
    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
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中一样,当方法的名称为字符串时,可以使用多种方法调用该方法,而在ruby中则更为简单。)

  • 该方法执行

  • 将响应发送到浏览器后,rails将销毁控制器实例:

    obj=nil


  • 不知道你在问什么,所有的
    @post
    变量都是相同的变量。但是我们有post.new,post.new(post_参数),post.find(params[:id]),我来自Java背景。这让我很困惑。它们都被分配到同一个@post。3个相同的变量名,但有3个不同的函数。你介意向我解释一下吗?谢谢!!!!!确实消除了我对这些变量的疑虑。:)再次感谢您!感谢您对ror和java并排进行比较的解释!你们真的很有帮助:)希望有一天我能像你们一样擅长编程。还有很多东西要学,我会继续努力的!谢谢,祝你今天愉快