sessions_controller.rb
class SessionsController < ApplicationController
def new
@user = User.new
end
def create
@user = User.find_by(email: user_params[:email])
if @user && @user.password == user_params[:password]
cookies[:user_id] = @user.id
redirect_to blogs_path
else
flash.now[:notice] = "invalid email or password"
render :new
end
end
private
def user_params
params.require(:user).permit(:email,:password)
end
end
new.html.erb
<p id="notice"><%= notice %></p>
<h1> Sign in </h1>
<%= form_with(url: sessions_path, method: :post) do |form| %>
<div>
<%= form.label :email %>
<%= form.text_field :email %>
</div>
<div>
<%= form.label :password %>
<%= form.password_field :password %>
</div>
<%= form.submit "Submit" %>
<% end %>
我使用Rails并创建了一个带有create操作的SessionsController来处理表单提交。但是,似乎表单没有被正确处理,我不知道为什么。每当我在这里单击Submit时,它就以前面的方式呈现表单
有人能帮我解决这个问题,并提供一些指导如何解决它?我真的很感激任何援助,在得到表格提交工作正常。
1条答案
按热度按时间mgdq6dx11#
这样生成的输入
name
属性将是user[email]
和user[password]
。因为您的params
必须有一个用户密钥:{user: {email: "myemail", password: "123"}}
,因为你需要它params.require(:user)
。此外,如果你有 Turbo(在rails 7中默认),你需要这个来显示错误响应:
更新
当你制作表单时,最重要的部分是表单生成器生成的
name
属性:你只需要知道
form_with
是如何工作的:提交表单会把你带到
SessionsController#create
,提交的表单参数会被rails解析,并在params
助手中提供,对于url编码的参数,它看起来像这样:默认情况下,
params
返回ActionController::Parameters
对象。你必须允许参数,这样你就可以给予它们到User
模型。这是不允许的:因为我可以发送email=myemail&superadmin=true
,现在我负责。在控制器中,首先发生的是调用
user_params[:email]
=>params.require(:user).permit(:email,:password)
如果添加
model: @user
:注意,当你获取单个属性时,你不必允许参数,就像在
User.find(params[:id])
中一样。我是怎么确定的?看看表格,没有
model: @user
,这意味着上面的所有内容。这是一个普遍的问题。但你所要做的就是看看日志,你可以看到 * 参数 * 和任何错误,不显示在浏览器中。