2

RoR的新手。从我的角度来看,我无法掌握如何在表单控制器上调用简单方法的概念。我想从视图中收集两条信息,在表单控制器上调用一个方法,该方法将根据参数检索一条信息,然后在同一视图或另一个视图上显示该信息。现在,我正在尝试使用表单控制器实例变量来完成新信息的显示——不知道如何刷新视图以显示它,但这是未来的障碍。现在,我可以单击我的提交按钮而不会出现任何错误,但它显然没有击中我的表单控制器方法。这是我的 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
4

2 回答 2

2

一旦控制器移交给视图,就没有回头调用其他方法了。控制器的工作是提前准备好视图可能需要的一切。一旦进入render阶段,就无法调用控制器方法。

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

helper_method :get_hotel_recommendation
def get_hotel_recommendation
  # ...
end

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

在您的情况下,如果您只使用一次,您可能应该跳过对实例变量的赋值并只返回有问题的对象。该视图将如下所示:

<%= 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 (...)。通常这并没有什么不同,Ruby 可以非常宽松,但有时它会巧妙地改变参数的解释方式,从而在您尝试诊断问题时导致很多混乱。从风格上讲,只有关键字 like if,whilecase在括号前有一个空格,因为这些不是方法调用。

至于为什么您的表格不起作用,目前尚不清楚。这些参数应该按照您的意愿提交,但也许您没有得到正确的路由。请记住,除非您正在做一些奇特的事情,否则最好坚持使用标准、、、index和名称。在这种情况下,您可能应该将其定义为显示多条记录或始终为一条记录。newshoweditindexshow

于 2013-04-07T08:25:11.687 回答
0

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

于 2013-04-07T08:16:27.250 回答