如何从我在Rails中的视图调用表单控制器上的方法?

时间:2013-04-07 08:06:18

标签: ruby-on-rails ruby

RoR的新人。我无法从我的视角中掌握如何在我的表单控制器上调用一个简单方法的概念。我想从视图中收集2条信息,在窗体控制器上调用一个方法,该方法将根据参数检索一条信息,然后在同一个视图或另一个视图上显示该条信息。现在,我试图使用表单控制器实例变量来完成新信息的显示 - 不知道我将如何刷新视图以显示它,但这是未来的障碍。现在,我可以单击我的提交按钮而不会出现任何错误,但显然没有达到我的表单控制器方法。 这是视图的erb文件:

<h1>Enter Required Information</h1>

<%= form_tag (get_hotel_recommendation_path) do %>
  <%= label_tag(:name, "Name:") %>
  <%= text_field_tag(:name) %>
  <%= label_tag(:date, "Date (yyyy-mm-dd):") %>
  <%= text_field_tag(:date) %>
  <%= submit_tag("Submit") %><br><br>
  <%= label_tag(:recommendation, "Recommendation:") %>
  <%= @recommended_hotel_name %>
<% end %>

这是我的表单控制器代码:

class RecommendHotelController < ApplicationController

  @recommended_hotel_name = ''

  def collect_info

  end

  def get_hotel_recommendation
    @recommended_hotel_name = Member.recommended_hotel_name( params[:name], params[:date] )
  end

end

我真的只想要一种简单易行的方法 - 不一定是最好的。我只需要一个快速的UI来演示我的模型代码。我需要尽快完成它。

新表单控制器代码:

class RecommendHotelController < ApplicationController

  def collect_info
  end

  def get_hotel_recommendation
    redirect_to recommend_hotel_path
  end

  protected

    helper_method :recommended_hotel_name
    def recommended_hotel_name
      unless (params[:name].nil?)
        Member.recommended_hotel_name(params[:name], params[:date])
      end
    end

end

2 个答案:

答案 0 :(得分:2)

一旦控制器移交给视图,就不会再调用其他方法了。控制器的工作是提前准备视图可能需要的所有内容。一旦进入render阶段,就无法调用控制器方法。

这个例外是可以可以调用的辅助方法。您需要明确声明要在视图中使用的任何方法。举个例子:

helper_method :get_hotel_recommendation
def get_hotel_recommendation
  # ...
end

Helper方法也可以位于关联的帮助器模块中,如果在视图中使用 ,最好将它们放在那里。

在你的情况下,如果你只使用一次,你应该跳过一个实例变量的赋值,然后返回有问题的对象。视图看起来像:

<%= recommended_hotel_name %>

调整后的控制器方法:

class RecommendHotelController < ApplicationController
protected
  helper_method :recommended_hotel_name
  def recommended_hotel_name
    Member.recommended_hotel_name(params[:name], params[:date])
  end
end

值得注意的是,在类上下文中声明@recommended_hotel_name = ''可能不是您想要的。这会创建一个类变量,而不是实例变量。控制器中的实例变量必须在主要操作方法内或before_filter方法内定义。还要记住,默认情况下,实例变量为nil,因此无需先将它们初始化为nil。在视图中使用时,空字符串和<%= ... %>是等效的,form_tag(...)内的所有内容都会自动转换为字符串。

需要注意的另一件事是在方法名称和参数之间留一个空格。它应该是form_tag (...)而不是if。通常这没有什么区别,Ruby可以非常宽松,但有时它可以巧妙地改变解释参数的方式,从而在您尝试诊断问题时导致很多混乱。从风格上讲,只有whilecaseindex等关键字在括号前有空格,因为这些不是方法调用。

至于为什么你的表格不起作用,目前尚不清楚。这些参数应该按照您的意愿提交,但也许您没有得到正确的路由。请记住,除非您正在做一些异国情调,否则最好坚持使用标准newshoweditindex名称。在这种情况下,如果它显示多条记录,您应该将其定义为show,如果它始终是一条记录,则应该{{1}}。

答案 1 :(得分:0)

您可以从params数组中的表单提交中获取所有信息。但是,从您的示例中,我建议使用:form_for而不是使用单独的form_tags。