2015-04-06 82 views
1

我一整天都在阅读rails文档和指南,并且整天尝试使用不同的教程,但似乎没有任何帮助。我目前有一个小应用程序,它有一个停止表,一张公共汽车桌和一个时间表表。时间表是公交车和停靠桌之间丰富的连接。与控制器和视图相比,我明白轨道的db和模型部分。使用轨道中的表单将数据从视图传递到控制器

我的停止表有一个ID字段,一个经度字段和一个纬度字段。

我基本上想要用户输入经度和纬度的值,然后通过匹配用户在停止表中给出经度和纬度来查询并找出停止ID。

达到此目的的最佳方法是什么?在我看来,我可以创建一个表单,让用户输入经度和纬度,我可以将该值存储在某个变量中,然后执行查询。我确切地知道我想做什么,但我不知道如何在rails中做到这一点。我很沮丧,我会很感激任何意见。

我对形式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个小时里,我一直坚持这一点。

回答

1

首先,确保你的模型在数据库中表现出来,你有没有运行迁移,你能发布你的模式吗?

如果你是从头开始,你可以运行此命令起床,与模型快速运行:

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

bin/rake db:migrate 

更新:如果您不需要用户位置数据库中的坚持,你可以使用ActiveModel(跳过上面的内容)。在模型文件夹中创建一个location.rb文件并创建加载ActiveModel:

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

现在选址模型代替,你需要使用创建的控制器方法来保存纬度和经度:

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

    @location.save 
    redirect_to @location 
end 

更新:现在您已经捕获了用户位置,您想使用此信息将其与停止表进行比较,以便查找相关记录。在这里,您需要使用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

是否需要创建一个名为Location的单独表格?我问的原因是因为我有一个包含不同公交车站名称,经度和纬度的停靠表。因此,当用户输入经度和纬度时,我只需将他们映射到停靠桌上的公交站点。所以在这种情况下,我只需要暂时保存从用户接收到的经度和纬度值。因此,为什么我会创建一个称为位置的新表?对不起,我不是故意批评你,你可能是对的,但我只是想理解推理。 – user1010101 2015-04-06 03:49:44

+2

好吧,我明白你的意思是巴士站是预先填充的,除非你想把它记录在数据库中,否则你不需要用户输入的数据库表,除非你可以使用[active_model](http ://www.rubyinside.com/rails-3-0s-activemodel-how-to-give-ruby-classes-some-activerecord-magic-2937.html) – hagope 2015-04-06 03:55:31

+1

对不起,我不清楚我的问题。但基本上我会预先填充名为Stop的表,其中将有名称,经度和纬度。所以现在当用户输入经度和纬度时,我会根据匹配为他们分配一个停止ID。所以这就是为什么我正在考虑接受用户输入,暂时将它们存储在一个变量中,然后在停止表中进行查询,其中经度= @ long和latitude = @ lat,如果两者匹配,我会返回一个停止ID。如果你能告诉我如何做到这一点,我将非常感激。我知道一旦我克服了我可以加速的基本学习曲线。 – user1010101 2015-04-06 03:59:30

0

如果我可以建议的东西:看这个Railscast http://railscasts.com/episodes/273-geocoder?view=asciicast

这将帮助你实现你在找什么比你现在正在下降的路线更简单的方式。

基本上这个插曲需要的是如何使用gem将地名转换为坐标,反之亦然,甚至将IP地址转换为街道地址。 Geocoder gem还可以通过它们的距离和方位找到附近的位置,并具有许多其他有用的功能。

+0

谢谢你的建议,我会看这个链接之后我键入此评论列入白名单他们。此外,如果您可以为我的上述情况建议一个解决方案,我将不胜感激,因为我知道有更好的方法来做到这一点,但我觉得如果你帮助我了解我的情况,它将帮助我了解如何在视图和控制器之间传递值,反之亦然我认为这对理解rails框架非常重要。我一定会看看你现在发布的链接。再次感谢 – user1010101 2015-04-06 03:26:24

1

如果你想用多一点点功能的东西,你应该尝试geokit-rails gem,这会让你的坐标查询停止,得到的结果,即使坐标是不完全,正确,将取回最近的站点。

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

    class Stop < ActiveRecord::Base 
        acts_as_mappable 
    end 
    

    注:检查the optionsacts_as_mappable原因,你需要改变一些东西,比如默认的距离单位和默认latlng列名

  • 然后现在你可以在你的控制器中做这样的查询

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

    这将发现有5英里之内(这是默认的距离单位,可改为公里),从点你在搜索

提供的所有公交车站:在PARAMS将可能是一个关键:welcome内部范围的,所以它可能是更好的使用强大的参数

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

我会看你的建议。但暂时,是否有可能告诉我如何调整我的解决方案,以达到预期的效果...再次感谢我一定会看到它,但我非常坚持如何将价值从视图传递到控制器因为在很多情况下我都需要知道这一点。所以如果你可以请帮助我,我会很感激。 – user1010101 2015-04-06 06:15:36

+0

事情是,参数在':location'下,所以要访问它们,你需要做这样的事情'@longitude = params [:location] [:longitude]' – 2015-04-06 20:30:11

+0

当我做params [:location] [:longitude]我得到一个错误,说nil的方法'[]':'NilClass – user1010101 2015-04-06 20:34:41

相关问题