gpt4 book ai didi

ruby-on-rails - 如何从 Rails 中的 View 调用表单 Controller 上的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:02 24 4
gpt4 key购买 nike

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

这是我的表单 Controller 代码:

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 来演示我的模型代码。我需要尽快完成它。

新的表单 Controller 代码:

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

最佳答案

一旦 Controller 移交给 View ,就无法返回调用其他方法。提前准备 View 可能需要的一切是 Controller 的工作。一旦进入 render阶段,无法调用 Controller 方法。

异常(exception)情况是可以调用的辅助方法。您需要明确声明要在 View 中使用的任何方法。例如:

helper_method :get_hotel_recommendation
def get_hotel_recommendation
# ...
end

辅助方法也可以位于关联的辅助模块内,如果它们在 View 中独占使用,那么将它们放在那里是个好主意。

在你的例子中,如果你只使用一次,你应该跳过对实例变量的赋值并只返回有问题的对象。 View 看起来像:

<%= recommended_hotel_name %>

调整 Controller 方法:

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 = ''在类里面下文中可能不是您想要的。这将创建一个类变量,而不是实例变量。 Controller 中的实例变量必须在主要操作方法或 before_filter 中定义方法。还要记住实例变量是 nil默认情况下,因此无需先将它们初始化。空字符串和 nil在 View 中使用时是等效的,所有内容在 <%= ... %> 中会自动为您转换为字符串。

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

至于为什么您的表单不起作用,目前还不清楚。这些参数应该按照您的意愿提交,但您可能没有获得正确的路由。请记住,最好坚持使用标准 index , new , show , 和 edit名字,除非你正在做一些异国情调的事情。在这种情况下,您可能应该将其定义为 index如果它显示多条记录或show如果它总是一条记录。

关于ruby-on-rails - 如何从 Rails 中的 View 调用表单 Controller 上的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15860229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com