使用rails中的表单将数据从视图传递到控制器

时间:2015-04-06 03:14:37

标签: ruby-on-rails ruby

我一整天都在阅读rails文档和指南,并且整天都在尝试不同的教程,但似乎没有任何帮助。我目前有一个小应用程序,它有一个停止表,一个总线表和一个计划表。计划表是总线和停止表之间的丰富连接。我理解rails的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个小时里我一直坚持这一点。

3 个答案:

答案 0 :(得分:1)

首先,确保您的模型在数据库中表示,您是否运行了迁移,是否可以发布模式?

如果您从头开始,可以运行此命令以使用该模型快速启动并运行:

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

bin/rake db:migrate

更新:如果您不需要在数据库中保留用户位置,则可以使用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地图)来完成此项工作,或者使用您提出的任何算法。

您还希望确保拥有路线,默认的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 %>

答案 1 :(得分:1)

如果你想要更多功能的东西,你应该尝试geokit-rails gem,这将让你通过坐标查询停止,并获得结果,即使坐标不完全,对,它将获取最近的站点。

  • 首先检查gem页面并检查如何安装gem。
  • 然后在停止模型中添加mappable命令

    class Stop < ActiveRecord::Base
      acts_as_mappable
    end
    

    注意:检查acts_as_mappable lat因为您需要更改一些内容,例如默认距离单位和默认lng以及{{1}列名称

  • 然后你可以像你这样在你的控制器中进行查询

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

    这将从您在搜索中提供的点找到5英里范围内的所有公交车站(这是默认距离单位,可以更改为公里)

注意:参数可能会限定在:welcome键内,因此最好使用强参数将它们列入白名单

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

答案 2 :(得分:0)

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

这将帮助您以比目前正在下降的路线更简单的方式实现您所寻找的目标。

基本上这一集的内容是如何使用gem将地名转换为坐标,反之亦然,甚至将IP地址转换为街道地址。 Geocoder宝石还可以找到附近距离和方位的位置,还有许多其他有用的功能。