[英]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
定义的变量不同,因此可以在视图没有任何问题。
有关如何将这些变量传递到视图中的更多信息,请参见以下链接:
我用很多方法创建了一个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.new
, Post.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
如果您说自己被类似的东西弄糊涂了,那将更有意义。 但是,即使如此,还有什么让我感到困惑的呢? 有两个简单的规则:
之前,我这样说:
当浏览器请求页面时,请求将路由到您定义的方法之一。 该方法执行,该方法设置@post的值。 将响应发送到浏览器后,rails破坏所有已创建的变量。
在内部,工作方式是:
当将URL路由到某个控制器时,rails会创建该控制器类的实例:
obj = PostsController.new
Rails使用控制器实例来调用在控制器类中定义的方法之一(该方法由路由确定):
obj.show
(就像在Java中一样,当方法的名称为String时,有多种方法可以调用方法-在ruby中它要容易得多。)
该方法执行。
响应发送到浏览器后,rails破坏控制器实例:
obj = nil
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.