has_one , belongs_to 和 create_before 在 rails

Posted

技术标签:

【中文标题】has_one , belongs_to 和 create_before 在 rails【英文标题】:has_one , belongs_to and create_before in rails 【发布时间】:2014-05-05 01:29:18 【问题描述】:

我用脚手架创建了 2 个模型:

    问题 记者

我想为每个问题创建 1 个报告者,并使用 before_create 创建报告者。

我在数据库的问题表中按整数类型生成reporter_id。 下面的代码显示了问题和报告者的行动和模型:

问题.rb

class Problem < ActiveRecord::Base
  has_one :reporter
  before_create :build_reporter
end

reporter.rb

class Reporter < ActiveRecord::Base

  belongs_to :problem

end

problems_controller.rb

class ProblemsController < ApplicationController

  before_action :set_problem, only: [:show, :edit, :update, :destroy]

  def index
    @problems = Problem.all
  end

  def show
  end

  def new
    @problem = Problem.new
  end

  def edit
  end

  def create
    @problem = Problem.new(problem_params)

    respond_to do |format|
      if @problem.save
        format.html  redirect_to @problem, notice: 'Problem was successfully created.' 
        format.json  render action: 'show', status: :created, location: @problem 
      else
        format.html  render action: 'new' 
        format.json  render json: @problem.errors, status: :unprocessable_entity 
      end
    end
  end

  def update
    respond_to do |format|
      if @problem.update(problem_params)
        format.html  redirect_to @problem, notice: 'Problem was successfully updated.' 
        format.json  head :no_content 
      else
        format.html  render action: 'edit' 
        format.json  render json: @problem.errors, status: :unprocessable_entity 
      end
    end
  end

  def destroy
    @problem.destroy
    respond_to do |format|
      format.html  redirect_to problems_url 
      format.json  head :no_content 
    end
  end

私人的 def set_problem @problem = Problem.find(params[:id]) 结束

def problem_params
  params.require(:problem).permit(:reporter_id, :describe_id, :datetime, :trace_code, :status)
end

结束

reporter_controller.rb

class ReportersController < ApplicationController
  before_action :set_reporter, only: [:show, :edit, :update, :destroy]

  def index
    @reporters = Reporter.all
  end

  def show
  end

  def new
    @reporter = Reporter.new
  end

  def edit
  end

  def update
    respond_to do |format|
      if @reporter.update(reporter_params)
        format.html  redirect_to @reporter, notice: 'Reporter was successfully updated.' 
        format.json  head :no_content 
      else
        format.html  render action: 'edit' 
        format.json  render json: @reporter.errors, status: :unprocessable_entity 
      end
    end
  end

  def destroy
    @reporter.destroy
    respond_to do |format|
      format.html  redirect_to reporters_url 
      format.json  head :no_content 
    end
  end

  private
    def set_reporter
      @reporter = Reporter.find(params[:id])
    end

    def reporter_params
      params.require(:reporter).permit(:user_name, :gomrok_name, :phone_number)
    end
end

当我在 localhost:3000/problems 中选择新问题按钮时,会显示文本字段,但是当完成文本字段并选择创建问题按钮时,我会收到此错误:

ActiveRecord::UnknownAttributeError in ProblemsController#create 


unknown attribute: problem_id
Extracted source (around line #31):   


respond_to do |format|
  if @problem.save
    format.html  redirect_to @problem, notice: 'Problem was successfully created.' 
    format.json  render action: 'show', status: :created, location: @problem 
  else

problem_id 是什么?!

我没用过。

我想在数据库的问题表中设置报告者 ID;如何使用 before_create 或 after_create 创建报告者并将报告者 ID 保存在问题表中?

【问题讨论】:

【参考方案1】:

您错误地设置了关系。你所拥有的是problems 表中的reporter_id 列。在1-1 关系中,foreign_key 是在belongs_to 一侧创建的。因此,您的代码应如下所示:

class Problem < ActiveRecord::Base
  belongs_to :reporter
end

class Reporter < ActiveRecord::Base    
  has_one :problem   
  before_create :build_problem
end

【讨论】:

没关系,现在当我创建新记者时,rails 使用reporter_id 创建新问题,但其他问题字段为空;我在记者控制器的创建操作中使用“redirect_to :controller => 'problem', :action => 'new'”,但是当调用此操作时,我收到此错误:“AbstractController::DoubleRenderError in ReportersController#create”。如何在将问题保存到数据库之前完成问题的字段? 很高兴为您提供帮助 :)。那是一个新问题,如果尚未解决,您可以为它发布另一个问题。我或其他人很乐意提供帮助。我目前在您的 ReportsController 中没有看到 create 操作,因此无法发表太多评论。如果您尝试在一个操作中渲染/重定向两次,我建议您查看DoubleRenderError 的操作。

以上是关于has_one , belongs_to 和 create_before 在 rails的主要内容,如果未能解决你的问题,请参考以下文章

has_one belongs_to 关联 autosave => true 不保存

thinkphp一对多HAS_MANY

过滤用户发布用户参数

如何从另一个模型中检索嵌套模型数据? : 未定义的方法错误

thinkphp关联模型 condition关联条件怎么用,能说个例子吗

如何使用依赖:销毁而不造成无限循环