为什么我可以在方法参数中加上params [:from]?

时间:2011-03-03 08:43:47

标签: ruby-on-rails

嘿伙计们, 我是Ruby和Rails的新手,我做了一个小测试例子:

/应用/助手/

module HomeHelper
  def makeach(from, to, by)
    x = from
    while x <= to
      yield x
      x = x + by
    end
  end
end

/apps/view/home/new.erb

<form action="create" method="post">
  <input type="text" name="from" />
  <input type="text" name="to" />
  <input type="text" name="by" />
  <input type="submit" name="commit" value="Click it" />
</form>

/apps/views/home/create.erb

模块HomeHelper

<% makeach(params[:from], params[:to], params[:by]) do |x| %>
<%= x %>
<% end %>

/apps/controllers/home_controller.rb

class HomeController < ApplicationController
    def index
    end
    def create
    end
    def new
    end
end

action new中发布表单后,create view在浏览器中不输出任何内容 PS:我知道有很多方法可以改进我的代码,但在这里我只是想知道为什么我什么都没有。

1 个答案:

答案 0 :(得分:3)

所以,有一点是你缺少的是REST的基本思想。有关Rails如何处理控制流的可靠解释,请尝试this answer

但是,基本上,当你在路线中设置resources :home时,它会为你的七个标准控制器动作定义seven routes(SHOW,INDEX,NEW / CREATE,EDIT / UPDATE,DESTROY)。

当您尝试在浏览器中加载页面时,您正在发送GET请求。 NEW操作接受GET请求。 CREATE操作仅接受POST请求(如提交表单)。因此,在将表单发布到CREATE操作后,如果要向访问者显示某些内容,则需要重定向到接受GET请求的页面。

或者,可以覆盖Rails默认值以允许CREATE接受GET请求,但我认为这是一个坏主意。

您可能需要做的最简单的事情是确保控制器中的CREATE操作如下所示:

def create
  (... do whatever processing of the params you want to do here ...)
  redirect_to home_path # OR whatever other path you want.
end

在控制器操作结束时,您可以渲染(默认)或重定向。重定向只是跳转到另一个控制器操作并执行该操作中的任何操作。渲染通常显示与控制器操作同名的视图,但渲染有很多选项see here

要在视图中访问params,最好的办法是将它们分配给实例变量。 IE:

def ... # any action that accepts GET requests
  @value = params[:value]
end

但是,重定向后,params不会持续存在。因此,如果您对一个操作进行POST并重定向到另一个操作(常规约定),则需要将参数保存到数据库,或将其保存到session

在你的情况下,看起来你应该将它们存储在会话中,因为它们似乎没有附加到模型上。

然后在下一个控制器操作中,您将检查会话中是否存在某些变量,并将它们放在实例变量中以在视图中使用。

IE:

@value = session[:value] if session[:value]

我知道这很有吸引力,但我希望这可以帮助你了解正在发生的事情。最后一个建议是买入和阅读Beginning Rails 3。它简短,甜蜜,重点,只需要一个周末才能完成,最后你会真正理解轨道如何工作以及你的工作效率和未来学习将翻两番的大局。

祝你好运!