2 回答

TA貢獻1836條經驗 獲得超4個贊
您無法直接從視圖內調用 Rails 控制器方法,您需要向其發送請求。
一個好的方法是使用表格:
<%= form_for(@vehicle) do |f| %>
<input name="parked" type="checkbox" checked="<%[email protected]%>" />
<input type="submit" />
<%= end %>
然后您的控制器可以根據是否檢查來更新車輛params[:parked]并重定向回同一頁面
def change_parked
@vehicle.update_column(:parked, params[:parked])
redirect_to vehicle_path(@vehicle.id)
end
這樣做的好處是您不需要任何 JavaScript 即可對車輛進行更改。但是,如果您想避免頁面刷新......
要在沒有表單的情況下執行此操作,您需要使用 JavaScript 和 Ajax 來 ping 路由到該控制器方法的端點。
所以,你的parkingModeJavaScript 方法可能是這樣的(為了方便起見,我在這里使用 jQuery)
const request = $.post('/vehicles/change_parking')
request.done((response) => {
console.log('Do something here')
})
這將調用您的控制器方法,該方法可能返回JSON以下結果:
def change_parking
vehicle = Vehicle.find(params[:vehicle_id])
if !vehiculo.parking
vehicle.parking = true
vehicle.save
else
vehicle.parking = false
vehicle.save
end
render json: { vehicle: vehicle }, status: 200
end
然后您需要更改checked復選框的值:
const request = $.post('/vehicles/change_parking')
request.done((response) => {
$('input[type="checkbox"]).attr('checked', response.responseJSON.vehicle.parked)
})
我想談幾件事。
首先,當您可以將其簡化為類似以下內容時,您if在視圖中使用了一個語句:
<input type="checkbox" checked="<%= @vehicle.parked %> onchange="parkingMode(<%= @vehicle.id %>)">
這意味著僅checked當車輛停放時才會出現該復選框。
其次,在你的change_parking方法中,你只需要調用save一次
def change_parking
vehicle = Vehicle.find(params[:vehicle_id])
if !vehiculo.parking
vehicle.parking = true
else
vehicle.parking = false
end
vehicle.save
end
您也可以執行類似操作vehicle.parking = !vehicle.parking并刪除該if語句。

TA貢獻1796條經驗 獲得超4個贊
您可以使用 JS 調用控制器操作。但不是直接的。但是,您可以使用 Rails 已經提供的工具來執行此操作。
首先,我們渲染一個遠程復選框:
check_box_field?'parking_mode_toggle',?'1',?false,?remote:?true,?data:?{?url:?'/change_parking'?}
盡管官方文檔中沒有給出,但如果您閱讀Rails UJS代碼,您會發現只要勾選/取消勾選復選框,UJS驅動程序就會發出請求。
然后,在您的控制器中,您可以執行以下操作:
def change_parking
? # TODO: Change your database state according to the +params+ received
? respond_to do |format|
? ? format.js { render js: 'parkingMode()' }
? end
end
添加回答
舉報