簡體   English   中英

使用Rails中的表單將數據從視圖傳遞到控制器

[英]passing data from view to controller using a form in rails

我整天都在閱讀Rails文檔和指南,並整日嘗試各種教程,但似乎無濟於事。 我目前有一個小型應用程序,其中有一個停止表,一個公交車表和一個時間表。 時間表表是巴士和車站表之間的豐富連接。 與控制器和視圖相比,我清楚地了解了rail的db和model部分。

我的停止表有一個ID字段,一個經度字段和一個緯度字段。

我基本上希望用戶輸入經度和緯度的值,然后執行查詢並通過匹配停止表中給定的經度和緯度的用戶來找出停止ID。

實現此目標的最佳方法是什么? 我認為我可以創建一個表格,讓用戶輸入經度和緯度,並且可以將該值存儲在某個變量中,然后進行查詢。 我確切地知道我想做什么,但是我不知道該怎么做。 我非常沮喪,我將不勝感激。

我在index.html.erb中的表單代碼

<%= form_for :welcome do |f| %>

    <%= f.label :longitude %><br>

    <%= f.text_field :longitude %>
    <br>
    <br>
    <%= f.label :latitude %><br>
    <%= f.text_field :latitude %>


  <p>
    <%= f.submit %>
  </p>
<% end %>

我的控制器代碼

class WelcomeController < ApplicationController

  def index
     @long = params[:longitude]
     @lat =  params[:latitude]
  end


end

如果我做錯了事,請通知我? 另外,我如何從這里開始? 在過去的8個小時中,我一直停留在同一時間,我將不勝感激。

首先,請確保您的模型在數據庫中表示,是否已運行遷移,是否可以發布架構?

如果您是從頭開始,則可以運行以下命令以快速啟動並運行模型:

bin/rails generate model Location latitude:string longitude:string

bin/rake db:migrate

更新:如果您不需要用戶Location保留在數據庫中,則可以使用ActiveModel (跳過上面的內容)。 在models文件夾中,創建一個location.rb文件並創建ActiveModel:

class Location
  include ActiveModel::Model
  attr_accessor :latitude, :longitude
end

現在位置模型已經就位,您需要使用控制器中的create方法保存緯度和經度:

def create
  @location= Location.new(params[:location])

  @location.save
  redirect_to @location
end

更新:現在您已經捕獲了用戶位置,您想使用此信息將其與Stop表進行比較,以找到相關的記錄。 在這里,您將要使用resque(或其他隊列)或通過調用第三方API(例如Google Maps)或使用您想出的任何算法來完成此工作。

您還需要確保您具有路由,可以通過以下方式實現默認的CRUD路由:

Rails.application.routes.draw do

  resources :location
end

最終在您看來(請注意,我使用的是模型名稱位置而不是歡迎使用):

<%= form_for :location do |f| %>
  <p>
    <%= f.label :latitude %><br>
    <%= f.text_field :latitude %>
  </p>

  <p>
    <%= f.label :longitude %><br>
    <%= f.text_area :longitude %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

如果您想要一些具有更多功能的東西,則應該嘗試使用geokit-rails gem ,這將使您可以按坐標查詢停靠點,即使坐標不完全正確也可以獲取結果,正確的是,它將獲取最近的停靠點。

  • 首先檢查gem頁面,並檢查如何安裝gem。
  • 然后在您的停止模型中添加mappable命令

     class Stop < ActiveRecord::Base acts_as_mappable end 

    注意:請檢查acts_as_mappable 的選項 ,因為您需要更改一些內容,例如默認距離單位以及默認latlng列名稱

  • 然后,您可以像這樣在控制器中進行查詢

     class WelcomeController < ApplicationController def index lng = params[:longitude] lat = params[:latitude] Stop.within(5, origin: [lat, lng] end end 

    這將查找距離您在搜索中提供的點相距5英里(默認距離單位,可以更改為km)內的所有公交車站

注意 :這些參數可能會在:welcome鍵中限定范圍,因此最好使用強參數將其列入白名單

def bus_stop_params
  params.require(:welcome).permit(:latitude, :longitude)
end

如果我可以提出建議,請觀看此Railscast http://railscasts.com/episodes/273-geocoder?view=asciicast

這將幫助您以比當前要走的路線更簡單的方式來實現所需的功能。

基本上,此情節涉及的是如何使用gem將地名轉換為坐標,反之亦然,甚至將IP地址轉換為街道地址。 Geocoder寶石還可以通過其距離和方位找到附近的位置,並具有許多其他有用的功能。

暫無
暫無

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

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