首页 > 解决方案 > Ruby on Rails 中的变量语法

问题描述

我正在阅读 ruby​​ on rails 教程,但我仍然对语法有些困惑。

class PostController < ApplicationController
    def index
        @posts = Post.all
    end

    def create
        @post = Post.new(post_params)
    end 

private
    def post_params
        params.require(:post).permit(:title, :body)
    end
end

我来自 javascript 背景。

根据我对从模型文件夹中的类实例化@posts@变量的理解。Post但是:post,均值到底是什么:意思,从何params而来,又是什么?

标签: ruby-on-railsruby

解决方案


这里有两件事。一种是实例变量,或@- 前缀变量。这些是对象实例的本地。对同一个对象实例调用的任何方法都@posts可以访问它。这些不在对象实例之间共享。

如果你熟悉 JavaScript,这很像this.poststhis部分的意思是“这个对象的本地”而不是“一些名为posts”的变量。

Rails 使用这些作为从控制器到视图共享数据的一种方式。您定义的任何实例变量都会传播到可以使用它们的视图实例。这是 Rails 独有的行为。

这个:post东西是一个符号,或者一个内部化的字符串。从概念上讲,符号只是代表该特定名称的常数。的每个实例都:post指向同一个对象,因此这意味着它们在存储方面非常便宜,并且比较是微不足道的。

在比较两个字符串时,需要做更多的工作。"post" == "post"需要比 做更多的计算:post == :post。您会看到很多在 Ruby 哈希结构中使用的符号键,它们通常用于表示事物,例如方法调用或类名,如 inbelongs_to :model_type等。

将它们视为“单例字符串”。

Ruby 编程语言更奇特的事情之一是它对符号的依赖程度以及符号很容易与字符串混淆,因为许多方法会采取非此即彼的方式,而另一些则非常特殊。

当你在概念上习惯它们时,它们真的很方便,但它不是你在其他语言中看到的,比如 C++、Python、JavaScript 或你拥有的语言。


推荐阅读