2015-08-20 44 views
1

从视图中存储某些东西在我的类变量中的正确语法是什么?比方说,这是代码:在视图中访问类变量

控制器:

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

* 
* 
* 
methods 
* 
* 
* 
end 

表:

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

这仅仅是一个形式的一个例子,因为它没有功能,我不能从视图中查找访问@@myvar的正确语法。谢谢 !

+1

这是一个非常非常糟糕的做法,绝不应该在rails中完成!请告诉我们为什么你需要这个,我们找到更好的解决方案! –

+0

btw:form_for对象以“f”作为对象的标识符打开一个块。对象是模型的对象,而不是控制器 –

+0

嗯,我想在控制器中有一种临时变量来完成一些可以从窗体接收数据的东西,而且我不擅长导轨所以我不能想出另一种方法,这就是为什么我想出了这个。 – lmatejic

回答

1

作为请求我编辑,包括attr_accessor

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

你有轨的模型,让我们把它叫做动物

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(这是一个新的动物)相关联。你传递| f |成块,所以用F你可以访问形式

=form_for @animal do |f| 

那么你可以去为每个字段需要调用另一个轨道帮手 您还可以访问attr_accessors。

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

由你得到的东西

不fortget f.submit因为你的表单需要一个提交按钮

,如果你现在点击此按钮,表格将被张贴到钢轨的创建方法。所以你需要把它带入你的控制器

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?!

+0

我了解这些事情的原理,我不知道如何实现我在评论中写到的东西。创建一个变量,它将从视图中获取某些内容,然后对其执行操作,而不会将其存储在实际的数据库中,因为这不是必需的。 – lmatejic

+0

如果你不想让它在数据库中,那么你去attr_accessor。生病编辑我的帖子 –

+0

attr_accessor可用于您不想直接存储在数据库中的值,并且只会存在于对象的生命周期(例如密码)中。 –

2

千万不要这么做

你可以得到或任何类别的设置类变量:

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

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

而是执行此操作:

如果这是您要提供给该控制器中的所有行动过滤器前,考虑AA实例变量集中的变量:

class FooController < ApplicationController 

    before_filter :set_var 

    private 
    def set_var 
     @my_var = "I'm a string" 
    end 
end 
在你看来

然后,只要调用<%= @my_var %>

+0

我怎么能从我的文章中的那种形式存储东西到变量中? – lmatejic