我在查看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对象?
另外,我应该使用助手而不是在控制器中声明这个吗?如果是这样,怎么样?我有点不知道该做什么。
所以任何帮助或方向都会受到高度赞赏
答案 0 :(得分:3)
<强>控制器强>
当你提到你不知道你的方法是应该存储在控制器还是帮助器中时,你需要了解MVC编程模式在Rails中的作用:
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