Rails 4如何从Model类重定向到Controller动作

the*_*ter 2 ruby-on-rails ruby-on-rails-4

我想实现以下逻辑:
我们通过普通视图与我们的数据库进行交互.通过视图,可以对数据库对象执行基本的CRUD操作.每当现在一个特定的布尔值(对于任何记录)设置为true时,我想将此记录传递给REST API控制器,然后构建一个要发送给已知客户端的http字符串.

在模型类中,我通过after_update回调观察所需的值

 private
    def check_boolean
        @listofusers ||= Array.new
         if self.boolean_changed?
             @listofusers.push(self)
         end    
             #redirect_to send_updates_path
             #redirect_to :controller =>'api/users',:action=>"send_updates"
      end
Run Code Online (Sandbox Code Playgroud)

这是我包含在我的路线中routes.rb以获取指定的助手

get 'send_updates', to: 'api/user#send_updates', as: :send_updates
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误消息:

NoMethodError (undefined method `redirect_to' for #<User:0x00000005abc778>):
Run Code Online (Sandbox Code Playgroud)

重定向到控制器操作的正确方法是什么?提前谢谢了.

Ric*_*eck 5

你要问的是反模式.

为了保持模型和数据库中的数据完整性,Rails在您modelcontroller代码之间保持着很大的差距:

在此输入图像描述

这就是一些看似简单的交叉的分歧,例如Devise current_user实际上防止了这种方法的发生.

因此,您必须重新思考您的结构是如何工作的.

-

简而言之,您应该将逻辑保留在控制器中:

#app/controllers/your_controller.rb
class YourController < ApplicationController
   def update
      @model = Model.find params[:id]
      @model = Model.update model_params
      if @model.boolean_changed?
          ## do something here
      else
          redirect_to ...
      end
   end
end
Run Code Online (Sandbox Code Playgroud)

任何数据操作都可以保存在模型中; 您的控制器是您的所有业务逻辑应驻留的位置.

要添加到此,您必须记住,根据上图,Rails不会直接向您的模型发送数据.它首先通过控制器,因此是保持逻辑的正确位置.

你正在做的就像试图用发动机驾驶汽车.