会话_控制器.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来处理表单提交.然而,表格似乎没有得到正确的处理,我不知道为什么.每当我在这里单击提交时,它只会以前面的方式呈现表单

有人能帮我解决这个问题并提供一些如何修复它的指导吗?如果您能帮助我让表格提交工作正常,我将不胜感激.

推荐答案

# add user model v
form_with(model: @user, url: sessions_path, method: :post)

这样,生成的输入name属性将是user[email]user[password].因为您的params必须具有用户密钥:{user: {email: "myemail", password: "123"}},因为您需要它params.require(:user).

此外,如果您有Turbo个错误响应(在rails 7中默认为Turbo个),您将需要它才能显示错误响应:

render :new, status: :unprocessable_entity

Update

创建表单时,最重要的部分是表单构建器生成的name个属性:

<%= form_with url: "/sign_in", method: :post do |f| %>
  <%= f.text_field :email %>
  <%#=> <input type="text" name="email"> %>
<% end %> #                      ^^^^^

<%= form_with model: @user, url: "/sign_in", method: :post do |f| %>
  <%= f.text_field :email %>
  <%#=> <input type="text" name="user[email]"> %>
<% end %> #                      ^^^^^^^^^^^

You just have to know how form_with works:
https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_with

提交表单将把您带到SessionsController#create,提交的表单参数由Rails解析,并在params助手中可用,对于URL编码的参数,它看起来如下所示:

#                                   name=value
>> Rack::Utils.parse_nested_query("email=asdf")
=> {"email"=>"asdf"}
>> Rack::Utils.parse_nested_query("user[email]=asdf")
=> {"user"=>{"email"=>"asdf"}}

默认情况下,params返回ActionController::Parameters对象.你必须允许参数,这样你才能把它们提供给User型号.这是不允许的:User.create(params),因为我可以发送email=myemail&superadmin=true,而现在我负责.

In your controller, first thing that happens is a call to
user_params[:email] => params.require(:user).permit(:email,:password)

>> parameters = Rack::Utils.parse_nested_query("email=myemail")
>> params     = ActionController::Parameters.new(parameters)
#  ^ this is what you have
#  v this is what happens (you have to look at server logs)
>> params.require(:user)
/home/alex/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/actionpack-7.0.4.3/lib/action_controller/metal/strong_parameters.rb:500:in `require':
param is missing or the value is empty: user (ActionController::ParameterMissing)

如果加上model: @user:

>> parameters = Rack::Utils.parse_nested_query("user%5Bemail%5D=myemail")
>> params     = ActionController::Parameters.new(parameters)
>> params.require(:user)
=> #<ActionController::Parameters {"email"=>"myemail"} permitted: false>
>> params.require(:user).permit(:email)
=> #<ActionController::Parameters {"email"=>"myemail"} permitted: true>
#                                                                 ^
# everything else should work from this point

请注意,在获取单个属性时,不必允许使用参数,例如User.find(params[:id]).

我怎么确定这一点的?看这张表格,看到model: @user,这意味着上面的所有^.这是一个常见的问题.但您所要做的就是查看日志(log),您可以在那里看到PARAMETERS以及浏览器中没有显示的任何错误.

Ruby-on-rails相关问答推荐

使用turbo流的部分渲染在rails 7中不起作用.

对Rails进行枚举不允许空值

参数数量错误(给定1个,预期为0个;必需关键字:IO、文件名)-活动存储

RSpec系统测试无法从工厂访问新创建的记录

如何从 gem 覆盖 JSONAPI.configure

Sweet Alert 2 在 Rails 7 应用程序中无法正常工作

Rails 7 应用程序 - 引用模型文件时出现未初始化常量错误

GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

Rails 100% 新手问题 - send() 方法

Rails 4,使用 ActiveRecord 的原始查询

如何避免 has_many :through 关系中的重复?

Rails:设计:按角色登录后重定向

使用 ActiveRecord 3 / Arel 查找单个记录的最佳方法?

如何获取包含表的列名的数组

设计自定义路由和登录页面

嵌套模型和父验证

Ruby on Rails i18n - 想要在模型中翻译自定义消息

设计/Rails - 如何删除特定的 Flash 消息? (登录成功)

在任何来源中都找不到 thread_safe-0.3.0

为什么 Rails 需要 JavaScript 运行时?