这是我在这里的第一个问题,我目前正在尝试构建我的第一个RubyonRails应用程序,所以这个问题可能是基本的。
问题:
我想要一个根网站上的表单,它只包含两个字段,一个用户模型的电子邮件和密码。根据键入的电子邮件地址是否已经存在,表单应将请求转发给"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方式"。
我重复了大量的代码,我觉得我在一个控制器里放了一些不是为了这个目的而做的东西。
另一个问题是,我无法让我的rspec集成测试工作,它基本上进入root_path,用一个新用户填写表单,点击按钮并期待一个成功的flash。。。但按下按钮后,测试返回一个空的html文档。尽管当我在浏览器中做同样的事情时,它运行得非常好。
所以我想:
你不能以某种方式将上面的if语句放在routes.rb文件中,并将请求重定向到相应的控制器和操作吗?
如果是,怎么办?
或者有人对如何做到这一点有不同的想法吗?
谢谢你,
-康斯坦丁
实际上,这是处理问题的一种相当可靠的方法。
Rails中的路由只是一种将URL映射到代码的简单方法。这样的逻辑正好属于你放置它的地方:在控制器中。
回答我自己的问题:
事实证明,规范问题只是由于webrat没有遵循rails 3中的重定向。这实际上是一个常见的问题,在这里已经解决了->例如。
所以,至少这个问题已经解决了。