几个小时以来我一直在尝试这个,但无济于事,所以,最后向你们寻求帮助。
Scenario
我有两个设计模型,即 College 和 Manager。它们都工作正常,但我想要实现的是 College 应该能够创建或删除一个 Manager。为此,我创建了一个 Codashboard controller#view,只有在 College 登录后才能访问它。这个 controller#view 对有一个表单,用于提交经理电子邮件和密码并提交到数据库。
Problem
每当我提交我的表单时,我都不会收到任何错误,但更改不会提交到数据库。
Details
从终端提取
Started POST "/codashboard" for 127.0.0.1 at 2016-03-14 04:59:41 +0530
Processing by CodashboardController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"P85GD7Wnt1RYNDgxxMxrSH6tUzW/PUBvqTXs8lYHY+HkvRXnq3s/IQL50SyMeDI1xXlalztTMbTZDNcPsXuckw==", "manager"=>{"email"=>"manager11@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
(0.1ms) BEGIN
(0.1ms) ROLLBACK
Redirected to http://localhost:3000/codashboard
Completed 302 Found in 4ms (ActiveRecord: 0.3ms)
对应 View
<%= form_for @addmanager, url: {action: "create"} do |f| %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.submit "Sign up" %></div>
<% end %>
对应 Controller
class CodashboardController < ApplicationController
def index
if college_signed_in?
@managers = College.find_by_id(current_college.id).managers
@addmanager = Manager.create(params[:addmanager])
end
end
def new
@addmanager = Manager.new
end
def create
Manager.create(params[:addmanager])
redirect_to codashboard_index_path
end
def addmanager
@addmanager = Manager.new(:email => "manager8@gmail.com", :password => "qwertyuiop")
@addmanager.save
redirect_to codashboard_index_path
end
end
注意:我尝试使用默认设计表单,但它总是在创建我不想要的新用户后登录。
注意 2:方法 addmanager 工作正常,每当调用时都会在数据库中添加一个条目。所以,我的模型没有问题。
请指出可能是什么问题
最佳答案
我强烈怀疑验证错误,你没有看到任何错误,因为你在失败和成功的验证中都进行了重定向,这里有两个选项:
快速而肮脏的方法,将 Manager.create
更改为 Manager.create!
如果验证失败,这将抛出错误。
做得很好,并在验证失败时重新呈现表单并显示错误消息:
class CodashboardController < ApplicationController
def create
@addmanager = Manager.new(addmanager_params)
if @addmanager.save
redirect_to codashboard_index_path
else
render :new
end
end
private
def addmanager_params
require(:addmanager).permit(:email, :password, :password_confirmation)
end
end
我还添加了强参数以确保只能设置允许的属性。
更新:
真正的错误是,Rails 从传递给它的模型中推断出属性键(即 @addmanager.class
,即 Manager
),因此您的响应在您的日志显示,其键值为“manager”:
"manager"=>{"email"=>"manager11@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}
但您希望它被键入为“addmanager”,如下所示:
"addmanager"=>{"email"=>"manager11@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}
要强制执行此操作,您可以使用 as:
选项更改 form_for
表单构建器以使用别名:
<%= form_for @addmanager, as: :addmanager, url: {action: "create"} do |f| %>
关于ruby-on-rails - 如何使用外部 Controller 创建新的设计用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35977312/