通过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
答案 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中定义的变量不同。因此,在视图中访问这些不同的变量没有任何问题。
有关如何将这些变量传递到视图的更多信息,请参阅以下链接:
答案 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.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 销毁所有创建的变量。
在内部,工作方式是:
当网址路由到某个控制器时,rails会创建该控制器类的实例:
obj = PostsController.new
Rails使用控制器实例调用控制器类中定义的方法之一(该方法由路由确定):
obj.show
(就像在Java中一样,当你将方法的名称作为String时,有一些方法可以调用方法 - 而且在ruby中它更容易。)
该方法执行。
将响应发送到浏览器后,rails会破坏控制器实例:
obj = nil