如何在轨道上的ruby中调用从模型到控制器的动作

时间:2018-02-13 10:20:38

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5

我试图从帖子模型中调用'check'动作。

class Post < ApplicationRecord
     after_commit :testing
     def testing
         @id = "#{self.id}"
         puts @id
         checking # call action to controller 
     end
end

posts_controller.rb

def checking
  puts "not Working"
end

我正在努力实现上述目标,而不是被召唤。

4 个答案:

答案 0 :(得分:0)

您可以通过实例化控制器来完成此操作。

SomeController.new.some_action

然而它是Not Recommended因为您的模型逻辑应独立于您的控制器逻辑。您的模型应遵循Single-responsibility Principle

  

一个班级应该只有一个责任。

您可能需要一些控制器和模型或某些服务的常用逻辑!

答案 1 :(得分:0)

据说:模型不应该知道控制器。

根据原因,

  1. 您可以在模型中定义checking,然后从Controller中为当前Post调用此方法。
  2. 如果应该从Controller设置某些内容并在Model中签入,则可以使用定义的方法here

答案 2 :(得分:0)

正如许多(或所有)其他人所说,您不应该从模型中调用Controller操作。如果要从Controller保存/销毁对象并且想要检查是否已调用commit,则可以在保存或销毁后在控制器中执行此操作。

posts_controller.rb

def create
  @post = current_user.posts.build(post_params)
  if @post.save
    checking
  end
end

def checking
  puts "Is is working"
end

如果这不是您想要的,因为您对提交回调特别感兴趣,您可以将代码更改为:

posts_controller.rb

def create
  @post = current_user.posts.build(post_params)
  @post.save
  if @post.commmited?
    checking
  end
end

def checking
  puts "Is is working"
end

并为您的模型添加一些逻辑:

class Post < ApplicationRecord
  attr_accessor :commit_performed

  #unset the commit_performed attribute on first callbacks
  before_destroy :unset_commit
  before_validation :unset_commit

  #set the commit_performed attribute after commit
  after_commit :set_commit

  def unset_commit
    @commit_performed = false
  end

  def set_commit
    @commit_performed = true
  end

  def commited?
    @commit_performed
  end
end

答案 3 :(得分:-1)

您不应该从模型中调用控制器操作。这甚至不是调用控制器方法的方式。如果要触发操作,则应将其写为视图表单或输入方法的目标,或者作为通过另一个控制器方法本身的重定向。如果你真的希望触发这个动作(如果你希望在将记录保存到监听器URL之后的消息),我建议使用诸如<directive><component-name [other attributes ignored]></component-name></directive>的lib或像HTTP::Net这样的宝石来使用其url或rails url_helper触发对操作的调用。这也没有建议,和/或不是在铁轨中操作东西的方式。