没有活动记录模型的表单,并显示预先存在的数据库数据

时间:2014-03-15 17:34:54

标签: ruby-on-rails ruby-on-rails-4

我有一个数据库,其格式为(country,LEmale,LEfemale)LE =预期寿命,我想向提交此表单的用户显示此数据:

<%= form_tag "pages#show" do %>
  <%= radio_button_tag(:sex, "male") %>
  <%= label_tag(:male, "I am male") %>
  <%= radio_button_tag(:sex, "female") %>
  <%= label_tag(:female, "I am female") %>
  <br>
  <%= label_tag(:country, "Country:") %>
  <%= text_field_tag(:country) %>
  <br>
  <%= number_field_tag 'age', nil, in: 10...110 %>
  <%= submit_tag("Submit", :id => 'submit')  %>
<% end %>

在同一页面上,但我不确定如何实现这一点,因为我没有预先存在的活动记录模型可供参考。到目前为止,我已经编写了以下代码,但表单不起作用,因为当我按提交时没有任何反应。

class PagesController < ApplicationController
  def index
  end

  def show
    @sex = params[:sex]
    @country = params[:country]
    @age = params[:age].to_i    
    @left = Country.new.time_left(@country, @sex, @age)
    redirect_to index
  end
end

和我的#34;包装模型&#34;

class Country < ActiveRecord::Base

  def time_left(country, sex, age)
    data = Country.find(country)
    sex == "male" ? expected = data.male.to_i : expected = data.female.to_i
    left = expected - age
  end  
end

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您尚未在form_tag中指定要提交的表单的有效网址。鉴于您的代码看起来像一个宁静的控制器,我假设您的 routes.rb 文件中有resources :pages,因此您需要执行类似form_tag "/pages/1", method: "get" do的操作,以便路由能够匹配。

我建议创建一个更适合命名的资源,并使用像 index 这样的“集合”路由,而不是像 show 这样的“成员”路由。或者向其添加额外的收集路由,以响应 POST 请求。

或者,您可以创建一个单一资源。

但是,在您将数据提交给控制器后,您的代码将无法满足您的预期,因为您在重定向后会丢失@left数据。如果您打算显示数据,则需要在那里渲染视图。最简单的方法是使用newcreate操作创建新资源。新操作会保留您的表单并提交给创建操作,该操作只是在create.html.erb模板中显示结果,您不应该重定向到其他位置。您可以在Rails Guides

中找到有关请求/响应周期的更多信息