如何在控制器的动作中定义的实例变量@variable可以从其视图中调用?
可以从视图中调用控制器操作中定义的变量和变量@variable
吗?
喜欢
class UsersControllers def index @whythiscolavery=User.all end end
现在在/views/users/index.html.haml中,为什么变量@whythiscolavery
可以在controllers动作中定义的视图中直接访问?
这个查询在重要的采访中让我失望了..
@whythiscolavery.each do user.name end
引用The Rails 3方式的Obie Fernandez:
Rails实现控制器到视图数据切换的方式是通过实例变量。 通常,控制器操作初始化一个或多个实例变量。 然后,视图可以使用这些实例变量。
在选择实例变量以在控制器和视图之间共享数据时,有一点讽刺(并且可能会对新手造成混淆)。 实例变量存在的主要原因是对象(无论是Controller对象,String对象等)是否可以保留不与其他对象共享的数据。 执行控制器操作时,所有操作都发生在控制器对象的上下文中 – 例如DemoController或EventController的实例。 上下文包括代码中的每个实例变量都属于控制器实例的事实。
呈现视图模板时,上下文是不同对象的上下文,即ActionView :: Base的实例。 该实例具有自己的实例变量,并且无权访问控制器对象的实例。
因此,从表面上看,实例变量是两个对象共享数据的最佳选择。 但是,有可能实现它 – 或者让它看起来发生。 Rails的作用是遍历控制器对象的变量,并为每个变量创建一个视图对象的实例变量,具有相同的名称并包含相同的数据。
对于框架来说,这是一种劳动密集型:这就像手工复制杂货清单一样。 但最终的结果是程序员对你来说更容易。 如果你是一个Ruby纯粹主义者,你可能会想到用于连接对象的实例变量,而不是将它们分开。 另一方面,作为Ruby纯粹主义者还应该包括理解你可以在Ruby中做很多不同的事情 – 比如在循环中复制实例变量。 所以没有什么真的不像Ruby那样。 从程序员的角度来看,它确实提供了一个无缝连接,在控制器和它呈现的模板之间。
视图基本上是控制器的方法,因此它们可以像普通的普通旧ruby类一样访问实例变量。 如果你上课了
class Donut def show @delicious = "very very delicious" end private def render_show "donuts are #{@delicious}" end end Donut.new.show
Erb(以及haml,js和所有其他渲染)以相同的方式处理。
因为在Ruby On Rails MVC架构和“约定优于配置”中 ,实例变量是跨越模型/视图/控制器和帮助器。
控制器中的方法是公共操作(除非它们受到保护)。 在该视图中可以使用该操作中分配的实例变量。
haml的语法是:
-@whythiscolavery.each do |user| = user.name
erb语法是
<%= @whythiscolavery.each do |user| %> <%= user.name %> <% end %>
如果你问如何从视图中访问变量,niiru的答案很好,除了erb语法示例中的额外’=’符号。 它应该是:
<% @whythiscolavery.each do |user| %> <%= user.name %> <% end %>
如果你问为什么变量在视图中可用 ,那是因为控制器使它们可用于视图(它们被复制到视图中)。 这个设计缺点(维护状态)促使创建了gem decent_exposure: https : //github.com/voxdolo/decent_exposure
- 在Simple_form中使用数组
- 如何计算Ruby中给定日期过去多少年?
- Rails:如何向包含变音符号的收件人发送电子邮件?
- Ruby的图表库
- RSpec:如何设置控制器的实例变量
- RSpec中“be_true”和“be true”之间的区别是什么?
- Net :: ReadTimeout:Net :: ReadTimeout和Selenium :: WebDriver :: Error :: UnknownError:未知错误:Chrome无法启动Rails 5.1.beta系统测试
- 在Ruby on Rails中访问自定义标头变量
- 如何在Amazon Elastic Beanstalk上部署rails项目时自动重启delayed_job?