1

我正在学习 Ruby on Rails(我的第一个 MVC),并成功地在“代理”和“邮政编码”之间建立了多对多的关系。我目前正在尝试做的是根据用户输入的邮政编码获取关联的代理。我能够在控制台中如此成功,但是很难将其转换为控制器和视图。

我在控制台中做什么:

zip = Zipcode.find_by_zip(gets.chomp)
=> 92562
zip.agents

我遇到的问题是如何将其转换为我可以从带有表单的视图中访问的操作。

我从定义动作(agents#find)开始,但是对于这是否正确以及之后发生的事情感到困惑。

def find
  @user_zip = Zipcode.find_by_zip(params[:zip])
end

希望这里很棒的人可以将n00b指向正确的方向。

4

3 回答 3

1

刚开始使用 rails 时,我建议#find尽可能避免自定义操作,而是坚持使用“Big 7”RESTful 路由。当你使用 Rails 并按照它的预期工作时,它真的很流畅。

听起来您可能正在尝试识别给定的邮政编码,然后列出与其关联的所有代理。这听起来像一个#showon Zipcode

配置/路由.rb

resources :zipcodes

应用程序/控制器/zipcodes_controller.rb

ZipcodesController < ApplicationController
  def show
    @zipcode = Zipcode.find_by_zip(params[:id])
  end
end

app/views/zipcodes/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]

于 2013-07-12T04:12:53.220 回答
0

只需放入@user_zip = Zipcode.find_by_zip(params[:zip])控制器而不是模型。

在视图中您将可以调用@user_zip.

于 2013-07-11T04:29:58.007 回答
0

欢迎来到 Rails!我最近也开始学习 Rails,但我想我可以提供帮助:默认情况下,控制器操作将重定向到具有相同名称的视图。所以在分配@user_zip 的值之后,控制器将提供agents/find.html.erb,它可以访问@user_zip。由于@user_zip 是Zipcode 的一个实例,因此您可以使用@user_zip.agents。

有点切题,但我也建议考虑使用 search 而不是 find 作为动作名称,只是因为在 Rails 的其他地方使用了 find 及其变体。

于 2013-07-11T06:37:50.447 回答