Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails中从模型到控制器调用操作_Ruby On Rails_Ruby On Rails 4_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 如何在RubyonRails中从模型到控制器调用操作

Ruby on rails 如何在RubyonRails中从模型到控制器调用操作,ruby-on-rails,ruby-on-rails-4,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 4,Ruby On Rails 5,我试图从post model调用“检查”操作 class Post < ApplicationRecord after_commit :testing def testing @id = "#{self.id}" puts @id checking # call action to controller end end 我正在尝试实现上述目标,但它没有被调用。您不应该从模型调用控制器操作。甚至控制器方法

我试图从post model调用“检查”操作

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

我正在尝试实现上述目标,但它没有被调用。

您不应该从模型调用控制器操作。甚至控制器方法也不是这样调用的。如果您想触发一个操作,那么应该将其作为视图窗体或输入方法的目标来编写,或者作为通过另一个控制器方法本身的重定向来编写。如果您确实希望触发此操作(如果您希望在将记录保存到侦听器url后发送消息),我建议使用库(如
HTTP::Net
或gem-like
HTTParty
)触发对操作的调用,并使用其url或rails url\u助手。这也是不建议的,并且/或者不是rails中的操作方式。

您可以通过实例化控制器来实现这一点

SomeController.new.some_action
但是,不建议使用
,因为您的模型逻辑应该独立于控制器逻辑。你的模式应该遵循

一个类应该只有一个职责


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

正如所说:模型不应该知道控制器

SomeController.new.some_action
视乎原因,

  • 您可以在模型中定义
    检查
    ,从
    控制器
    只需为当前
    Post
    调用此方法即可
  • 如果应该从
    控制器
    中设置某些内容并在
    模型
    中签入,则可以使用定义的方法
  • 正如许多(或所有)其他人所说,您不应该从模型调用控制器操作。如果您正在保存/销毁来自控制器的对象,并且希望检查是否调用了提交,则可以在保存或销毁后在控制器中执行此操作

    posts\u controller.rb

    def checking
      puts "not Working"
    end
    
    def create
      @post = current_user.posts.build(post_params)
      if @post.save
        checking
      end
    end
    
    def checking
      puts "Is is working"
    end
    
    def create
      @post = current_user.posts.build(post_params)
      @post.save
      if @post.commmited?
        checking
      end
    end
    
    def checking
      puts "Is is working"
    end
    
    如果这不是您想要的,因为您对提交回调特别感兴趣,您可以将代码更改为:

    posts\u controller.rb

    def checking
      puts "not Working"
    end
    
    def create
      @post = current_user.posts.build(post_params)
      if @post.save
        checking
      end
    end
    
    def checking
      puts "Is is working"
    end
    
    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
    
    class Post
    您应该从控制器调用模型函数,模型不应该知道控制器逻辑您这样做的原因是什么?更多地解释什么才是真正要做的,因为你似乎只是迷路了。模型不应该知道控制器的逻辑。也许你们可以重构并设置一些变量,从控制器到模型,就像本文描述的那个样,你们到底想要什么?你为什么要打电话给控制员?他的案子有很多工作要做。他不是真的需要一块宝石,他需要想想他到底想做什么。谢谢你们。这对我更有帮助。