从视图调用方法

时间:2014-07-31 08:43:59

标签: ruby-on-rails

我在查看switches/index.slim的方法时遇到问题:

=link_to 'Switch 1', switch_toggle_path, class: 'button'

和相应的路线:

get '/switches', to: 'switches#relay_toggle', as: 'switch_toggle'

和控制器:

class SwitchesController < ApplicationController

  include PiPiper
  before_action :init_pins

  def init_pins
    @relay1 = PiPiper::Pin.new(:pin => 18, :direction => :out)
    @relay2 = PiPiper::Pin.new(:pin => 27, :direction => :out)
  end

  def relay_toggle
    @relay1.read == 0 ? @relay1.update_value(1) : @relay1.update_value(0)
    redirect_to '/'
  end
end

我只需要实例化一次引脚,但显然我每次打电话都是这样做的,relay_toggle现在。我怎样才能确保它们只被实例化一次? 我可以将它们放在一个可以加载应用程序的地方吗?如果我这样做,那么我如何引用控制器中的@relay对象?

另外,我应该使用助手而不是在控制器中声明这个吗?如果是这样,怎么样?我有点不知道该做什么。

所以任何帮助或方向都会受到高度赞赏

3 个答案:

答案 0 :(得分:3)

<强>控制器

当你提到你不知道你的方法是应该存储在控制器还是帮助器中时,你需要了解MVC编程模式在Rails中的作用:

enter image description here

Rails的工作方式(并记住, Rails 基于 Ruby - it's a gem的实际情况),这意味着如果你想在系统中使用特定的方法/文件,它必须遵守上面详述的MVC编程模式。

-

关于您是否应该使用controller method或帮助者的问题的答案,如果打算加载helper ,请使用Model 之后你的观点。控制器方法整理来自Request -> Router -> Controller/Action -> View -> Helper 的相关数据 - 允许您在视图中显示它:

#config/initializers/your_initializer.rb
RELAY_ONE = PiPiper::Pin.new(:pin => 18, :direction => :out)
RELAY_TWO = PiPiper::Pin.new(:pin => 27, :direction => :out)

这是控制器设置项目的方式

-

<强>初始值设定

  

我可以将它们放在可以加载应用程序的地方吗?

您可以将它们放在initializer -

#app/controllers/switches_controller.rb
class SwitchesController < ApplicationController
  def relay_toggle
    RELAY_ONE.read == 0 ? RELAY_ONE.update_value(1) : RELAY_ONE.update_value(0)
    redirect_to '/'
  end
end

如果您使用上面的代码,它将创建两个constants,允许您在整个应用程序中调用它们(它们已经初始化)

如果你执行上述操作,它将使你能够从控制器中删除声明,而只是使用常量(当然,考虑到你只想要定义两个对象):

{{1}}

答案 1 :(得分:1)

您也可以使用类变量

class SwitchesController < ApplicationController

  include PiPiper
  @@relay1 = PiPiper::Pin.new(:pin => 18, :direction => :out)
  @@relay2 = PiPiper::Pin.new(:pin => 27, :direction => :out)

  def relay_toggle
    @@relay1.read == 0 ? @@relay1.update_value(1) : @@relay1.update_value(0)
    redirect_to '/'
  end
end

但我不确定那是你想做什么

答案 2 :(得分:0)

是的,你可以在服务器启动和app init上初始化一次,只需添加初始化程序并声明常量

# config/initializers/relay.rb
RelayOne = PiPiper::Pin.new(:pin => 18, :direction => :out)
RelayTwo = PiPiper::Pin.new(:pin => 27, :direction => :out)

# controller

def relay_toggle
  RelayOne.read == 0 ? RelayOne.update_value(1) : RelayOne.update_value(0)
  redirect_to '/'
end