簡體   English   中英

如何通過控制器從Rails視圖調用模型方法?

[英]How to call a model method from rails view through a controller?

請多多包涵。 我在這里遇到了類似的問題,但我的要求卻有所不同。

我有一個名為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行, ride_later_request發送更早的通知。 現在,我停止該操作,並嘗試通過添加按鈕在已保存的記錄上手動進行操作。 我的問題是如何在我試圖提供的此按鈕的開頭調用上面已經解釋過的def send_notif模型方法?

我知道這是特定於應用程序的問題,但是我想通過解釋來盡最大努力使它變得特定。 非常感謝您的幫助。

如何在RideLaterRequestController上創建send_notification操作,然后(在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM