1

我是 Ruby on Rails 的菜鸟,我有一个愚蠢的问题:在我的 session_controller 中我有

def create
    user = User.find_by_email(params[:email])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to root_path, :notice => "Logged in!"
    else
      flash.now.alert = "Invalid email or password"
      render "new"
    end
  end

在路线中我匹配'/signin',到:'sessions#new'

在 new.html.haml 我有

  = simple_form_for :session do |f|
    = f.input :email
    = f.input :password
    = f.button :submit, 'Sign in!'

当我按下“登录”按钮时,我希望将调用“创建”方法(它在我的用户模型中如何工作),但调试向我显示“新”方法,并且我有“authenticity_token”而没有填写电子邮件和密码。有人可以解释我发生了什么吗?我不明白何时调用“新”方法以及其他方法。

4

2 回答 2

5

此行为与simple_form. 您没有为要调用的操作指定 url,也没有传递任何模型来推断其路径,因此您最终会得到url_for()在空哈希上调用的方法。此调用的结果是当前页面,这显然与显示表单的路径相同,但POST作为 HTML 动词。

要调用您的sessions_path而不是您的,new_session_path您可以执行以下操作:

= simple_form_for :session, url: :sessions do |f|

通过 处理url_for,它实际上与指定相同,url: sessions_path但正在使您成为魔术师。

于 2012-07-12T19:59:19.103 回答
2

我不使用haml,我使用erb,但我怀疑工作相似。在 erb 中,您的表单需要调用一个操作,例如:

    form_for :session, :url => {:action => "create"} do |f|

这将调用会话控制器的 create 方法。所以我猜haml会是

    simple_form_for :session, :url => {:action => "create"} do |f|

希望这可以帮助

于 2012-07-12T20:00:34.597 回答