我有一个名为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天没有运气我会非常感谢你解决这个问题。
答案 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'