首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails如何知道要接受哪个变量?

Rails如何知道要接受哪个变量?
EN

Stack Overflow用户
提问于 2015-02-08 08:07:18
回答 3查看 57关注 0票数 1

这里的初学者在这里通过下面的mackenziechild.me教程。例如,我创建了一个具有许多方法的PostController。然而,令我困惑的是,他们似乎拥有相同的变量@post。在这种情况下,程序如何真正知道它需要得到哪个正确的变量?当应用程序运行时,他们不会感到困惑吗?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-08 08:56:58

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

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

但是我们有Post.new,Post.new(post_params),Post.find(params:id),我来自一个Java背景。所以这让我很困惑。他们所有的区域都被分配到同一个“岗位”

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

代码语言:javascript
复制
int x = 1;
x = 2;
x = 3;
System.out.println(x);  #=>3

而且,如果您有一个名为Post的类,也可以将三个不同的Post对象分配给同一个变量:

代码语言:javascript
复制
    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中,可以将不同的类型分配给相同的变量:

代码语言:javascript
复制
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中一样,当您将方法的名称命名为字符串时,有一些方法可以调用该方法--在ruby中,这要容易得多。)

  1. 该方法执行。
  2. 在将响应发送到浏览器后,rails破坏控制器实例: obj = nil
票数 0
EN

Stack Overflow用户

发布于 2015-02-08 08:29:22

在rails中,与index, new, show etc类似的每个操作(这是一个get方法)在相应的文件夹中都有相应的视图,命名为controller名称。

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

例:-

代码语言:javascript
复制
def index
    @posts = Post.all.order('created_at DESC')
end

它们应该是文件夹中的index.html.erb视图,而在该视图中,实例变量@posts将是可访问的。

在这一行Post.all.order('created_at DESC')中,Post模型查询数据库并将表中的所有记录提取为posts,并按created _at列的降序排序记录。

Post模型是从ActiveRecord::Base继承的,因此它可以映射数据库中的posts表。

代码语言:javascript
复制
def show
    @post = Post.find(params[:id])
end 

在上面的show方法中,它只查询id位于params[:id]中的一个记录。

实例变量在视图中是可访问的,因此在@post = Post.find(params[:id]) @post中可以在其对应的视图中作为show.html.erbapp/views/posts/中使用。

票数 2
EN

Stack Overflow用户

发布于 2015-02-08 08:21:35

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

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

How are Rails instance variables passed to views?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28391895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档