ruby-on-rails - 如何使用外部 Controller 创建新的设计用户

标签 ruby-on-rails database devise

几个小时以来我一直在尝试这个,但无济于事,所以,最后向你们寻求帮助。

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/

相关文章:

ruby-on-rails - xlsx 文件中的列和行折叠

ruby-on-rails - rails : Cannot include PgSearch Module provided by the pg_search Gem

ruby-on-rails - 这是什么意思? *** "Delete"参数 ":destroy,"需要是一个数字 (Rails)

java - 使用 JPA 的关系和参照完整性约束

sql - 什么是无界查询?

ruby - 没有路由匹配 [GET] "/"设计

html tidy 和 rails 应用程序 - erb 或 rthml 文件。 ruby 替代品?

mysql - 数据库设计和规范化

ruby-on-rails - 如何在 Rails 中设计电子邮件确认后登录用户

ruby-on-rails - Google oauth via devise 和 omniauth/oauth 不断请求访问