我正在学习Ruby on Rails(我的第一个MVC),并成功地在“Agents”和“Zipcodes”之间建立了多对多的关系。我目前要做的是根据用户输入的邮政编码获取关联的代理。我能够在控制台中如此成功,但我很难将其转换为控制器和视图。
我在控制台中做了什么:
zip = Zipcode.find_by_zip(gets.chomp)
=> 92562
zip.agents
我正在处理的是如何将其转换为我可以从带有表单的视图访问的操作。
我已经开始定义动作(代理#find),但是我知道这是否正确以及之后是什么。
def find
@user_zip = Zipcode.find_by_zip(params[:zip])
end
希望有人在这里很棒,可以将n00b指向正确的方向。
答案 0 :(得分:1)
刚开始使用rails时,我建议尽量避免使用#find
这样的自定义操作,而是坚持使用the "Big 7" RESTful routes。当你使用它并按照预期行事时,Rails非常流畅。
听起来好像您正在尝试识别给定的邮政编码,然后列出与之关联的所有代理商。这听起来就像#show
上的Zipcode
。
<强>配置/ routes.rb中强>
resources :zipcodes
应用/控制器/ zipcodes_controller.rb 强>
ZipcodesController < ApplicationController
def show
@zipcode = Zipcode.find_by_zip(params[:id])
end
end
应用/视图/邮编/ show.html.erb 强>
<div>
<p>This zipcode has the following agents:</p>
<ul>
<%= @zipcode.agents.each do |agent| %>
<li>Agent #<%= agent.id %></li>
<% end %>
</ul>
</div>
您可以浏览/zipcodes/[zip]
来查看此页面。
答案 1 :(得分:0)
只需将@user_zip = Zipcode.find_by_zip(params[:zip])
放入控制器而不是模型中。
在视图中,您可以拨打@user_zip
。
答案 2 :(得分:0)
欢迎使用Rails!我最近也开始学习Rails,但我想我可以提供帮助:默认情况下,控制器操作会重定向到具有相同名称的视图。因此,在分配了@user_zip的值之后,控制器将提供代理/ find.html.erb,它们可以访问@user_zip。由于@user_zip是Zipcode的一个实例,因此您可以使用@ user_zip.agents。
有点切向,但我也建议考虑使用搜索而不是找到动作名称,只是因为在Rails的其他地方使用了find及其变体。