[英]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.