Ruby on rails 从视图调用方法

Ruby on rails 从视图调用方法,ruby-on-rails,Ruby On Rails,从视图调用方法时遇到问题开关/索引。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_actio

从视图调用方法时遇到问题
开关/索引。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
class SwitchesController18,:direction=>:out)
@relay2=PiPiper::Pin.new(:Pin=>27,:direction=>:out)
终止
def继电器开关
@relay1.read==0@relay1.update_值(1):@relay1.update_值(0)
将_重定向到“/”
终止
终止
我只需要实例化一次管脚,但很明显,我每次调用,
relay\u toggle
时都会这样做。如何确保它们只实例化一次? 我可以把它们放在某个可以加载应用程序的地方吗?如果我这样做了,我将如何引用控制器中的@relay对象

另外,我应该使用helpers而不是在controller中声明它吗?如果是,怎么做?我有点不知道该怎么办


因此,任何帮助或指导都将不胜感激

是的,您可以在server start和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

是的,您可以在server start和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

您还可以使用类变量

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
class SwitchesController18,:direction=>:out)
@@relay2=PiPiper::Pin.new(:Pin=>27,:direction=>:out)
def继电器开关
@@relay1.read==0@@relay1.update\u值(1):@@relay1.update\u值(0)
将_重定向到“/”
终止
终止

但我不确定这是您想要做的

您也可以使用类变量

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
class SwitchesController18,:direction=>:out)
@@relay2=PiPiper::Pin.new(:Pin=>27,:direction=>:out)
def继电器开关
@@relay1.read==0@@relay1.update\u值(1):@@relay1.update\u值(0)
将_重定向到“/”
终止
终止

但我不确定这是您想要做的

控制器

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

Rails的工作方式(记住,Rails实际上是基于Ruby之上的),这意味着如果您想在系统中使用特定的方法/文件,它必须遵循上面详述的MVC编程模式

--

因此,对于是否应该使用
控制器方法
或助手的问题,如果要在查看后加载,则应该使用
助手
。控制器方法从您的
模型中整理相关数据
-允许您在视图中显示:

Request -> Router -> Controller/Action -> View -> Helper 
这是控制器设置项目的方式

--

初始化者

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

你可以把它们放在-

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

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

#app/controllers/switches_controller.rb
类SwitchesController<应用程序控制器
def继电器开关
继电器1.read==0?中继一。更新值(1):中继一。更新值(0)
将_重定向到“/”
终止
终止

控制器

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

Rails的工作方式(记住,Rails实际上是基于Ruby之上的),这意味着如果您想在系统中使用特定的方法/文件,它必须遵循上面详述的MVC编程模式

--

因此,对于是否应该使用
控制器方法
或助手的问题,如果要在查看后加载,则应该使用
助手
。控制器方法从您的
模型中整理相关数据
-允许您在视图中显示:

Request -> Router -> Controller/Action -> View -> Helper 
这是控制器设置项目的方式

--

初始化者

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

你可以把它们放在-

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

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

#app/controllers/switches_controller.rb
类SwitchesController<应用程序控制器
def继电器开关
继电器1.read==0?中继一。更新值(1):中继一。更新值(0)
将_重定向到“/”
终止
终止

您可以将它们放在初始值设定项中,但我建议不要这样做。如果使用rails生成器,则应该有一个swtiches\u helper类。你可以把方法放在这里。如果您没有助手文件,请在
app/helpers/switches\u helper.rb
中创建一个,您可以将它们放在初始值设定项中,但我建议不要这样做。如果使用rails生成器,则应该有一个swtiches\u helper类。你可以把方法放在这里。如果您没有助手文件,请在
app/helpers/switches\u helper.rb
Rich中创建一个,再次感谢您提供了非常详细的答案。这真的帮了我大忙!里奇