如何通过控制器从rails视图调用模型方法?

时间:2017-12-08 18:28:39

标签: ruby-on-rails

请耐心等待。我在这里遇到了类似的问题,但我的要求却与众不同。

我有一个名为 RideLaterRequest 的模型。在应用程序中,我允许用户在此模型上创建记录。目前,一旦保存了记录,就会向Android应用程序发送通知。逻辑如下:

ride_later_request.rb

class RideLaterRequest < ActiveRecord::Base

   after_save :send_notif #run send_notif method once the record is saved.

   def send_notif
      RideLaterRequestHandler.ride_later_request_created(self)
   end

end

上面的方法实际上调用了另一个类方法(早期的开发人员在一个单独的类中定义了一个方法)

class RideLaterRequestHandler
    def self.ride_later_request_created(ride_later_request)
      #####................####
    end
end

因此,一旦此方法执行,通知将被发送到Android应用程序。

现在我试图阻止这个自动化系统。并通过在视图文件中添加一个按钮来手动处理此流程。

首先,我通过在 ride_later_request.rb 文件中评论after_save :send_notif来停止自动通知。因此,一旦在该模型上保存新记录,就不会发送通知。

在视图文件中,我显示 RideLaterRequest 模型的记录,如下所示:

admin_reports_controller.rb

class AdminReportsController < ApplicationController

  def trip_report
   @ride_later_request = RideLaterRequest.all
  end

end

trip_report.html.erb

<table>
   <tr>
      <th>Date</th>
      <th>Trip ID</th>
      <th>Send Notification</th>
   </tr>
   <% @ride_later_requests.each do |trip_report| %>
   <tr>
      <td><%= trip_report.planned_start_time.to_date%></td>
      <td><%= trip_report.id%></td>
      <td>
       <%= button_to "Send Notification", #In normal case I would have added a path to the controller method to Send notification here %> 
      </td>
   </tr> 
</table>

正如您所看到的,我正在尝试添加按钮操作,以便发送通知。我在这里尝试做的唯一事情是,一旦创建了新的ride_later_request行,就会发送通知。现在我停止并尝试通过添加按钮在已保存的记录上手动执行此操作。我的问题是如何在我试图给出的这个按钮的开头调用我上面解释的def send_notif模型方法?

我知道这是应用程序特定的问题,但我已经尽力通过解释它来使其具体化,我想。非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

如何在send_notification上创建RideLaterRequestController操作,然后(在routes.rb中)设置send_nofication_ride_later_request路径。也许是这样的事情:

resources :ride_later_requests do 
  member do 
    post :send_nofication
  end
end

哪个收益率:

send_nofication_ride_later_request POST   /ride_later_requests/:id/send_nofication(.:format)   ride_later_requests#send_nofication
                                   POST   /ride_later_requests(.:format)                       ride_later_requests#create
               ride_later_requests GET    /ride_later_requests(.:format)                       ride_later_requests#index
            new_ride_later_request GET    /ride_later_requests/new(.:format)                   ride_later_requests#new
           edit_ride_later_request GET    /ride_later_requests/:id/edit(.:format)              ride_later_requests#edit
                ride_later_request GET    /ride_later_requests/:id(.:format)                   ride_later_requests#show
                                   PATCH  /ride_later_requests/:id(.:format)                   ride_later_requests#update
                                   PUT    /ride_later_requests/:id(.:format)                   ride_later_requests#update
                                   DELETE /ride_later_requests/:id(.:format)                   ride_later_requests#destroy

然后执行以下操作:

<%= link_to 'Send Notification', send_nofication_ride_later_request_path(trip_report), method: :post %>

您可以将该链接打扮成按​​钮。

然后,在RideLaterRequestController中,例如:

class RideLaterRequestController < ApplicationController

  ...

  def send_notification
    @ride_later_request = RideLaterRequest.find_by(id: params[:id])
    RideLaterRequestHandler.ride_later_request_created(@ride_later_request)
    # redirect, render, or whatever depending on whether you want this 
    # to be AJAXy or regular HTML.
  end

  ...

end