这里的初学者在这里通过下面的mackenziechild.me教程。例如,我创建了一个具有许多方法的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发布于 2015-02-08 08:56:58
我已经用很多方法创建了一个PostController。然而,令我困惑的是,他们似乎拥有相同的变量@post。在这种情况下,程序如何真正知道它需要得到哪个正确的变量?当应用程序运行时,他们不会感到困惑吗?
当浏览器请求页面时,请求将被路由到您定义的方法之一。该方法执行,该方法设置@post的值。在将响应发送到浏览器后,rails将销毁所创建的所有变量。
但是我们有Post.new,Post.new(post_params),Post.find(params:id),我来自一个Java背景。所以这让我很困惑。他们所有的区域都被分配到同一个“岗位”
在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()); #=>goodbyePost.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将销毁所创建的所有变量。
在内部,工作方式是:
obj = PostsController.newobj.show(就像在Java中一样,当您将方法的名称命名为字符串时,有一些方法可以调用该方法--在ruby中,这要容易得多。)
obj = nil发布于 2015-02-08 08:29:22
在rails中,与index, new, show etc类似的每个操作(这是一个get方法)在相应的文件夹中都有相应的视图,命名为controller名称。
因此,当一个动作被调用时,它们的特定视图就会被调用。
例:-
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表。
def show
@post = Post.find(params[:id])
end 在上面的show方法中,它只查询id位于params[:id]中的一个记录。
实例变量在视图中是可访问的,因此在@post = Post.find(params[:id]) @post中可以在其对应的视图中作为show.html.erb在app/views/posts/中使用。
发布于 2015-02-08 08:21:35
Ikanyu,@post变量是一个实例变量,即它的作用域限制在它定义的方法上。因此,在新方法中定义的@post变量不同于在show中定义的变量,因此在视图中访问这些不同的变量没有任何问题。
有关如何将这些变量传递到视图中的更多信息,请参阅以下链接:
https://stackoverflow.com/questions/28391895
复制相似问题