0

我的应用程序的基本概述。目前有两种型号。作业模型和客户模型。两种模型都有has_and_belongs_to_many关系,因为我打算允许用户创建一个客户端条目,然后为他们分配一个或多个工作。

这是我的两个模型。

客户 -

class Client < ActiveRecord::Base 
  has_and_belongs_to_many :job
end

工作 -

class Job < ActiveRecord::Base
  has_and_belongs_to_many :client
end

我一直在做一些研究,我认为我认为这种关系需要一个外键才能起作用,所以我在我的数据库中添加了一个client_id列和一个列。job_id

客户页面目前正在运行,这是我的控制器。

class ClientsController < ApplicationController

        def index
          @clients = Client.all

          respond_to do |format|
            format.html # index.html.erb
            format.json { render json: @clients }
          end
        end

        # GET /Clients/1
        # GET /Clients/1.json
        def show
          @clients = Client.find(params[:id])

          respond_to do |format|
            format.html # show.html.erb
            format.json { render json: @clients }
          end
        end

        # GET /Clients/new
        # GET /Clients/new.json
        def new
          @clients = Client.new

          respond_to do |format|
            format.html # new.html.erb
            format.json { render json: @clients }
          end
        end

        # GET /Clients/1/edit
        def edit
          @clients = Client.find(params[:id])
        end


        def create
          @clients = Client.new(params[:client])

          respond_to do |format|
            if @clients.save
              format.html { redirect_to @clients, notice: 'Client was successfully created.' }
              format.json { render json: @clients, status: :created, location: @clients }
            else
              format.html { render action: "new" }
              format.json { render json: @clients.errors, status: :unprocessable_entity }
            end
          end
        end

        # PUT /Clients/1
        # PUT /Clients/1.json
        def update
          @clients = Client.find(params[:id])

          respond_to do |format|
            if @clients.update_attributes(params[:client])
              format.html { redirect_to @clients, notice: 'Client was successfully updated.' }
              format.json { head :no_content }
            else
              format.html { render action: "edit" }
              format.json { render json: @clients.errors, status: :unprocessable_entity }
            end
          end
        end

        # DELETE /Clients/1
        # DELETE /Clients/1.json
        def destroy
          @clients = Client.find(params[:id])
          @clients.destroy

          respond_to do |format|
            format.html { redirect_to :clients , notice: 'Client was successfully removed.'}
            format.json { head :no_content }
          end
        end

        def details
            @clients = Client.find_by_id(params[:id])
            @jobs = Client.job
        end
      end

这就是我目前的工作控制器。

class JobsController < ApplicationController

  def index
    @jobs = Job.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml { render :xml => @job }
    end
  end

  def new
    @jobs = Job.new 

    respond_to do |format|
      format.html # index.html.erb
      format.xml { render :xml => @job }
    end
  end

  def create
    @jobs = Job.new(params[:job])
    @cients = Client.find = Client.find(params[:id])

    respond_to do |format|
      if @jobs.save
        format.html { redirect_to(@jobs,
                      :notice => 'Job was successfully created.') }
        format.xml  { render :xml => @jobs,
                      :status => :created, :location => @Job }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @jobs.errors,
                      :status => :unprocessable_entity }
      end
    end
  end
end

在我的工作表格中,我得到了以下代码,该代码添加了一个包含所有已创建客户端的下拉列表。

<%= select("job", "client_id", Client.all.collect {|c| [ c.name, c.id ] }, {:include_blank => 'None'})%> 

当我按下保存时。我收到以下错误。

unknown attribute: client_id

Application Trace | Framework Trace | Full Trace
app/controllers/jobs_controller.rb:22:in `new'
app/controllers/jobs_controller.rb:22:in `create'

我认为这是因为我需要定义一种在我的工作创建中查找 client_id 的方法,以及在我的客户端创建中指定一个方法。

这是我的第一个 Rails 应用程序,所以我不太确定如何。

任何帮助将不胜感激。

4

2 回答 2

1

在您的协会中多元化您的工作和客户。IE

has_many_and_belongs_to :jobs
has_many_and_belongs_to :clients

如果您不使用 ActiveRecord :through 方法的多对多关联的替代方法(HMABT 的替代方法),您必须自己创建连接表,该表是 job_id 和 client_id 的表。

于 2012-05-09T21:16:28.320 回答
1

你的jobs桌子没有client_id,也不应该有。您需要创建一个联结表来促进多对多关系。它应该被调用clients_jobs并包含一个整数client_idjob_id

这里还有很多错误。以下是我不经意间看到的东西:

  1. 这一行:

    @cients = Client.find = Client.find(params[:id])
    

    应该:

    @cients = Client.find(params[:id])
    
  2. 多元化在 Rails 中很重要。客户没有很多“工作”。它有很多工作您的模型应该反映这一点:

    class Client < ActiveRecord::Base 
      has_and_belongs_to_many :jobs
    end
    
    class Job < ActiveRecord::Base
      has_and_belongs_to_many :clients
    end
    
  3. 您需要通过迁移创建一个联结表,这是您的外键所在的位置:

    $ rails g migration AddClientsJobsTable 
    
  4. indexandnew中,您首先创建@jobs = Job.new然后通过:xml => @job. 同样,多元化很重要。你需要@job = Job.new. 您在 中遇到了同样的问题create,除了您删除了“s”并将“J”大写::location => @Job }您不能在编程中这样做。大小写和拼写都很重要。

  5. Job.find(:all)Client.all:选择一个。不要混用find :all.all

  6. @clients = Client.find(params[:id]). 您正在寻找一个特定的客户,而不是客户的集合。你的变量应该被调用@client。这不是一个错误,但它非常丑陋。
于 2012-05-09T21:18:36.863 回答