捕获rails中的用户输入并在数据库中查询它

时间:2015-04-07 01:08:43

标签: ruby-on-rails ruby

我有一个名为Welcome的控制器,其中包含一个名为index的视图,其中包含一个小表单,用户可以在文本字段中输入经度,纬度值。

这是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

以下是我的路线档案

Rails.application.routes.draw do
  get 'welcome/index'
  post 'welcome/index'
end

我有一张名为stop的表。在其中有预先填充的数据,包括id,名称,经度和纬度。

我想要实现的目标 所以基本上我想做一个小的检查,我在那里查询一个停止的停止ID,它具有用户输入的匹配的经度和纬度值。最后,我想在index.html.erb页面上打印那个停止ID

我面临的问题 所以例如我创建的小形式。假设我为经度字段输入值“123”,为纬度字段输入“456”。点击提交后,我在终端中看到以下内容

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"N7RssIp7sQggxZ2RArEf9CnrUYXK6aG7Ix1MJlI5MoEPDocATHjXdlo24w0gFCTG+4B43ks0sVx1XNlS3RO84Q==", "welcome"=>{"longitude"=>"123", "latitude"=>"456"}, "commit"=>"Save Welcome"}
  Rendered welcome/index.html.erb within layouts/application (33.6ms)
Completed 200 OK in 108ms (Views: 107.5ms | ActiveRecord: 0.0ms)

然而,在我的欢迎控制器中,当我执行以下操作时

Stop.find_by longitude: '@long'

我在终端

中看到了这个
Stop Load (0.2ms)  SELECT  `stops`.* FROM `stops` WHERE `stops`.`longitude` = 0 LIMIT 1

由此可见,我没有正确捕获用户输入。有人可以告诉我如何解决这个问题吗?

我知道有更好的方法来获取位置等,但我只是在学习轨道,我必须了解做这些事情的基本知识。如果有任何不清楚的地方,请告诉我。我试图解决这个问题过去2天没有运气我会非常感谢你解决这个问题。

2 个答案:

答案 0 :(得分:1)

form_for是一个模型后面的表单,这意味着你需要传递一个具有经度和纬度参数的模型的对象。在这种情况下,您没有,所以您应该使用form_tag:

<%= form_tag("/welcome/index", method: "post") do %>
  <%= label_tag :longitude %><br>
  <%= text_field_tag :longitude %>
  <br>
  <br>
  <%= label_tag :latitude %><br>
  <%= text_field_tag :latitude %>
  <p>
    <%= submit_tag("Submit") %>
  </p>
<% end %>

现在你的路线需要一点点修理。

Rails.application.routes.draw do
  get 'welcome/index', to: 'welcome#index'
  post 'welcome/index', to: 'welcome#create'
  get 'welcome/new', to: 'welcome#new'
end

您需要2个不同的页面,新页面显示经度和纬度的输入,以及显示停止信息的索引。现在你的控制器应该是这样的

class WelcomeController < ApplicationController
  # displays the form, so change the name of the form you have now to new.html.erb
  def new
  end

  # the form will pass to this action to perform logic on longitude and latitude
  def create
    longitude = params[:longitude]
    latitude = params[:latitude]
    @stops = Stop.where("longitude = ? AND latitude = ?", longitude, latitude)
    render :index
  end

  # if it renders from the create action, @stops will be available to use here
  def index
  end
end

现在在index.html.erb文件中,显示与经度和纬度的用户输入匹配的停止ID

<% if @stops %>
  <% @stops.each do |stop| %>
    <p>
      stop id: #{stop.id}<br>
      latitude: #{stop.latitude}<br>
      longitude: #{stop.longitude}
    </p>
  <% end %>
<% end %>

答案 1 :(得分:0)

在您的控制器中尝试使用params[:welcome][:longitude] 代替 params[:longitude]

尝试Stop.find_by longitude: "'#{@long}'" 而不是 Stop.find_by longitude: '@long'