Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在视图Rails中调用ActiveRecord方法可以吗_Ruby On Rails_Ruby_Ruby On Rails 4_Activerecord_Methods - Fatal编程技术网

Ruby on rails 在视图Rails中调用ActiveRecord方法可以吗

Ruby on rails 在视图Rails中调用ActiveRecord方法可以吗,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,methods,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,Methods,使用Rails 4 我想知道(并且很难找到答案)直接从视图调用ActiveRecord方法是否可以,例如: <%= Article.where(approved: true).count %> 或 我意识到通常的做法是将它们存储在控制器内部的一个实例变量中,但是由于我使用的是分部变量,所以我不能这样做 这样做行吗?会痛吗?有没有更好的方法(例如帮助器方法)?谢谢大家! 您始终可以使用局部变量在分部中传递这些变量: <%= render partial: "form",

使用Rails 4

我想知道(并且很难找到答案)直接从视图调用ActiveRecord方法是否可以,例如:

<%= Article.where(approved: true).count %>


我意识到通常的做法是将它们存储在控制器内部的一个实例变量中,但是由于我使用的是分部变量,所以我不能这样做


这样做行吗?会痛吗?有没有更好的方法(例如帮助器方法)?谢谢大家!

您始终可以使用局部变量在分部中传递这些变量:

<%= render partial: "form", locals: {zone: @zone} %>

在controller中定义实例变量始终是一个很好的做法,它不会有什么坏处,但最终不会在视图中执行业务逻辑。

您主要应该这样做

class Article < ActiveRecord::Base
....

  scope :approved_articles, where(approved: true)
  scope :short_answer_presence, where("short_answer is NOT NULL and short_answer != ''")
end
并在视图中使用这些变量

如果是偏音,正如我的拉曼所说,你可以这样做

<%= render partial: "form", locals: {approved_articles_count: @approved_articles_count, short_answer_presence_count: @short_answer_presence_count} %>

这样做行吗?会痛吗

这当然没问题,但问题是您将调用另一个db查询,这是Rails应用程序中最“昂贵”的部分

@instance_变量
设置一次,可在整个视图中使用:

#app/views/articles/show.html.erb
#Referencing @article references stored data, not a new DB query
<%= @article.title %>
<%= @article.description %>
<%= @article.created_at %>

为了直接回答您的问题,如果您只计算特定于数据库的数据,则可以调用该数据

如果您试图计算
@文章的数量
,您可以调用
@articles.size
()

谨慎的开发人员将确定控制器中有哪些数据,以及需要从数据库中提取哪些数据。。。在控制器本身中执行所有db工作:

#app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
   def index
      @articles = Article.where(approved: true) #-> could use a scope here if you wanted
   end
end

#app/views/articles/index.html.erb
<%= @articles.size %>

这将允许您根据需要设置局部变量,如果未设置,还可以设置“默认值”。

太棒了,谢谢您提供的详细答案。我要走这条路。只是好奇,像我一样直接从视野中称呼它会不会有伤害@NithinIt不会是一个问题,但它不会遵循RailsDry的概念。但对很多事情来说,这不是一个好方法。
#app/views/articles/show.html.erb
#Referencing @article references stored data, not a new DB query
<%= @article.title %>
<%= @article.description %>
<%= @article.created_at %>
#app/views/articles/show.html.erb
#Bad practice
<%= Article.select(:name).find(params[:id]) %>
<%= Article.select(:description).find(params[:id]) %>
<%= Article.select(:created_at).find(params[:id]) %>
#app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
   def index
      @articles = Article.where(approved: true) #-> could use a scope here if you wanted
   end
end

#app/views/articles/index.html.erb
<%= @articles.size %>
#app/views/shared/_partial.html.erb
<% approved ||= Article.approved_articles.size %>
<% short    ||= Article.short_answer_presence.size %>