亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 JavaScript 中調用 Rails 方法

如何在 JavaScript 中調用 Rails 方法

慕雪6442864 2023-08-10 15:44:06
我是 ruby on Rails 的新手,我想從 javascript 調用控制器方法顯示.html.erb<label class="switch">  <%if @vehicle.parking%>    <input type="checkbox" checked onchange="parkingMode(<%= @vehicle.id %>)">  <%else%>    <input type="checkbox" onchange="parkingMode(<%= @vehicle.id %>)">  <%end%>  <span></span></label>車輛控制器.rbdef change_parking  vehicle = Vehicle.find(params[:vehicle_id])  if !vehiculo.parking    vehicle.parking = true    vehicle.save  else    vehicle.parking = false    vehicle.save  endend車輛.jsfunction parkingMode(id){    console.log(id)}
查看完整描述

2 回答

?
HUH函數

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語句。


查看完整回答
反對 回復 2023-08-10
?
SMILET

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


查看完整回答
反對 回復 2023-08-10
  • 2 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號