如何根据Rails 3中的条件转发/路由请求?

时间:2011-06-09 07:51:00

标签: ruby-on-rails ruby ruby-on-rails-3 routing routes

这是我在这里的第一个问题,我目前正在尝试构建我的第一个Ruby on Rails应用程序,所以这个问题可能是基本的。

问题:

我想在根网站上创建一个表单,该表单只包含两个字段,即用户模型的电子邮件和密码。根据输入的电子邮件地址是否已存在,表单应将请求转发给'users#create'(即创建新用户)或'sessions#create'(即在...中签名用户) 。如果密码正确的话)

我尝试了什么:

为了解决这个问题,我在页面控制器中创建了一个名为'decision'的新动作,并将表单指向该页面。

它基本上是这样的:

def decide
  if User.find_by_email(params[:email])
    # Copied in all of the code from sessions#create
    # with a redirect at the end so a /decide page doesn't get rendered
  else
    # Copied in all of the code from users#create
    # with a redirect at the end so a /decide page doesn't get rendered
  end
end

-

现在这很有效,我为自己感到自豪,我认为它是一个完整的初学者,但我能听到有经验的程序员在这段代码中痛苦地哭泣。我很确定这不是“Rails Way”。

我重复了大量的代码,我觉得我在控制器中放了一些不是为了这个目的。

另一个问题是我无法让我的rspec集成测试工作,它基本上转到root_path,用新用户填写表单,点击按钮并期望成功闪存...但测试得到按下按钮返回一个空的html文档。虽然当我在浏览器中做同样的事情时它完全正常。

所以我想:

难道你不能以某种方式将上述if语句放在routes.rb文件中并将请求重定向到相应的控制器和操作?

如果是这样的话?

或者有人有不同的想法如何实现这个目标吗?

谢谢,

-Konstantin

2 个答案:

答案 0 :(得分:1)

实际上,这是处理问题的一种相当可靠的方法。

Rails中的路由只是将URL映射到代码的简单方法。像这样的逻辑属于你放置它的地方:在控制器中。

答案 1 :(得分:1)

回答我自己的问题:

原来的规格问题仅仅是由于webrat没有跟踪rails 3中的重定向。实际上这是一个常见问题,例如->here已解决。

所以至少这个问题已经解决了。