【问题标题】:Accessing class variables in views在视图中访问类变量
【发布时间】:2015-08-20 11:16:57
【问题描述】:

从视图中将某些内容存储在我的类变量中的正确语法是什么?假设这是代码:

控制器:

class FooController < ApplicationController
@@myvar = "I'm a string"

*
*
*
methods
*
*
*
end

表格:

<%= form_for(@something) do |f| %>
    <%= f.text_field :myvar %>
    <%= f.submit %>
<% end %>

这只是表单的一个示例,因为它不起作用,我找不到从视图中访问@@myvar 的正确语法。谢谢!

【问题讨论】:

  • 这是一种非常非常糟糕的方法,永远不应该在 Rails 中完成!请告诉我们您为什么需要它,我们会找到更好的解决方案!
  • 顺便说一句:form_for 对象打开一个以“f”作为对象标识符的块。 object 是模型的对象,而不是控制器的对象
  • 嗯,我想在控制器中有一种临时变量来做一些可以从表单接收数据的东西,我对 Rails 不太熟练,所以我不能想出另一种方法,这就是我想出这个的原因。

标签: ruby-on-rails-4 class-variables


【解决方案1】:

根据我的要求编辑,包括 attr_accessor

轨道方式。我只是飞过去,希望你能得到它。你肯定需要阅读更多关于 Rails 及其概念的介绍。

你有一个rails-model,我们称之为Animal

class Animal < ActiveRecord::Base
  attr_accessor :non_saved_variable

end

这是有一个数据库表,假设在这个表中我们存储种族、姓名和年龄。

现在我们需要一个控制器来创建/编辑/更新/删除动物

class AnimalController < ActionController::Base
   def new
     # this creates a new animal with blank values
     @animal = Animal.new
   end
end

现在您需要进入您的 routes.rb 并为动物创建路线

resources :animal

这将为动物的每个动作创建所有(宁静的)路线。

现在你需要有你的模板来呈现一个表单

form_for 是一个rails 助手,用于创建一个与@animal 相关联的表单(这是一个新的Animal)。你通过 |f|进入块,所以你可以使用 f 访问表单

=form_for @animal do |f|

然后您可以针对需要调用另一个 Rails 助手的每个字段 您还可以访问 attr_accessors。

=f.text_field :race
=f.text_field :name
=f.text_field :age
=f.text_field :non_saved_variable

你得到的东西

不要忘记f.submit,因为您的表单需要提交按钮

如果你现在点击你的按钮,表单将被发布到 rails 的 create 方法。所以你需要把它带入你的控制器

def create
   # create a new animal with the values sended by the form
   @animal = Animal.new params[:animal]

   # here you can access the attr_accessor
   @animal.do_something if @animal.non_saved_variable == "1337"

   if @animal.save
     # your animal was saved. you can now redirect or do whatever you want
   else
     #couldnt be saved, maybe validations have been wrong
     #render the same form again
     render action: :new
   end
end

我希望这能让您对 Rails 有了初步的了解?!

【讨论】:

  • 我了解这些东西的原理,我不知道如何实现我在评论中写的内容。创建一个变量,该变量将从视图中获取某些内容并对其进行处理,而不需要将其放在实际数据库中,因为这不是必需的。
  • 如果您不希望它在数据库中,那么您可以使用 attr_accessor。生病编辑我的帖子
  • attr_accessor 可用于您不想直接存储在数据库中且仅在对象生命周期内存在的值(例如密码)。
  • 这是我一直在寻找的东西。在控制器中再次访问 attr 怎么样?例如。我想在保存对象之前对该值做一些事情,这可能吗?
  • 是的,你可以用价值做一些事情。生病再次编辑它
【解决方案2】:

不要这样做

您可以通过以下方式从任何类中获取或设置类变量:

<%= FooController.class_variable_get(:@@myvar) %>
<%= FooController.class_variable_set(:@@myvar, 'value') %>

这可能不是你想要的。不要做。你想达到什么目的?

改为:

如果它是您希望该控制器中的所有操作都可以使用的变量,请考虑在 a before 过滤器中设置一个实例变量:

class FooController < ApplicationController

  before_filter :set_var

  private
    def set_var
      @my_var = "I'm a string"
    end
end

那么在你看来,只需拨打&lt;%= @my_var %&gt;

【讨论】:

  • 我怎样才能从我的帖子中的那种形式将一些东西存储到该变量中?
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 2023-03-09
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多