CustomersController中的ActiveRecord :: RecordNotFound #new找不到没有ID的Business

时间:2015-11-24 13:01:02

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord rubymine

所以我在SO的其他问题中查看了这个错误的其他实例,似乎没有任何帮助。因此,我的身份验证系统应该允许企业注册,并允许用户在其业务下注册。但是,我找不到没有身份证的业务""错误。

class CreateUsers < ActiveRecord::Migration
  def change


    create_table :users do |t|

      t.references :company, foreign_key: true


      t.timestamps
      t.string :first_name
      t.string :last_name

      t.string :email
      t.string :password_digest
      t.string :remember_digest
      t.string :role

    end


class CustomersController < ApplicationController

  def new

    set_business

    @customer = @business.customers.create(user_params)

  end

  def create

    @customer = Customer.new(customer_params)
    @customer.save!
    session[:customer_id] = @customer.id
    redirect_to '/'
  rescue ActiveRecord::RecordInvalid => ex
    render action: 'new', alert: ex.message
  end

  private
  def customer_params

    params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password_digest, :business_id) 
  end

  def set_business

    @business = Business.find (params[:business_id])

  end



HTML snippet: Customer.new.html.erb

<h1>Sign Up</h1>

      <%= form_for(@customer) do |f| %>
          <%= f.label :first_name %>
          <%= f.text_field :first_name, :placeholder => "First name" %>
          <%= f.label :last_name %>
          <%= f.text_field :last_name, :placeholder => "Last name" %>
          <%= f.label :email %>
          <%= f.email_field :email, :placeholder => "Email" %>
          <%= f.label :company_id %>
          <%= f.collection_select :business_id, Business.all, :id, :name %>
          <%= f.password_field :password_digest, :placeholder => "Password" %>
          <%= f.submit "Create Account", class: "btn-submit" %>
      <% end %>



class Business < ActiveRecord::Base
  has_many :customers

end

class Customer < ActiveRecord::Base
  belongs_to :business
end

如何在不收到此错误的情况下定义@business变量,以便用户可以在其业务下注册?我希望他们从表单上的可用公司列表中进行选择,然后在用户注册时将它们链接到数据库中。我究竟做错了什么?我是Ruby的新手,我可能需要一些很好的解释为什么会发生这种情况。

谢谢你的时间:)

2 个答案:

答案 0 :(得分:1)

你应该看一下params []的内容,因为那里没有简单的:business_id密钥,它嵌套在:customers hash:

将你的set_business更改为这样的想法:

  def set_business

    @business = Business.find (params[:customer][:business_id])

  end

编辑:这不起作用,因为第一次调用new方法时,没有提供params。您应该只获得填写表单的企业列表!

def new
  @customer = Customer.new
  @businesses = Business.all
end

EDIT2:在创建方法中,您也不需要设置商家,因为它已经由表单设置了!

def create
  @customer = Customer.create(customer_params)
  @customer.save
end

答案 1 :(得分:0)

更新controller

customers_controller.rb

class CustomersController < ApplicationController
  before_action :set_business

  def new
    @customer = @business.customers.build
  end

  def create
    begin
      @customer = @business.customers.new(customer_params)
      @customer.save!
      session[:customer_id] = @customer.id
      redirect_to '/'
    rescue ActiveRecord::RecordInvalid => ex 
      render action: 'new', alert: ex.message
    end
  end

  private
  def customer_params
    params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password_digest, :business_id) 
  end

  def set_business
    @business = Business.find (params[:business_id])
  end
end
相关问题