我试图从帖子模型中调用'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
我正在努力实现上述目标,而不是被召唤。
答案 0 :(得分:0)
您可以通过实例化控制器来完成此操作。
SomeController.new.some_action
然而它是Not Recommended
因为您的模型逻辑应独立于您的控制器逻辑。您的模型应遵循Single-responsibility Principle。
一个班级应该只有一个责任。
您可能需要一些控制器和模型或某些服务的常用逻辑!
答案 1 :(得分:0)
据说:模型不应该知道控制器。
根据原因,
checking
,然后从Controller
中为当前Post
调用此方法。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触发对操作的调用。这也没有建议,和/或不是在铁轨中操作东西的方式。