0

尝试将新条目保存到我的数据库时遇到问题。提交时,项目应保存到项目表中,该项目中的技术/技术应保存到名为 Technols 的技术表中,它们之间的关系存储在名为 Projecttechnols 的表中。

这是我的新动作:

def new
    @project = Project.new
    @technol = Technol.new(params[:tech])

@all_technols = Technol.all
tech_ids = params[:technols][:id].reject(&:blank?) unless params[:technols].nil?


@project_technol = @project.projecttechnols.build





#@project_technol = Projecttechnol.new

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

创建动作:

    def create
    @all_technols = Technol.all
    @project = Project.new(params[:project])

@technol = Technol.new(params[:tech])




params[:technol].each_value do |tech|

technology = Technol.find_by_tech(tech.strip)

@project_technol = @project.projecttechnols.build(:technol_id => technology.id)

end


    @project.client = params[:new_client] unless params[:new_client].blank?
    @project.project_owner = params[:new_project_owner] unless params[:new_project_owner].blank?
    @project.tech = params[:new_tech] unless params[:new_tech].blank?
    @project.role = params[:new_role] unless params[:new_role].blank?
    @project.industry = params[:new_industry] unless params[:new_industry].blank?
    @project.business_div = params[:new_business_div] unless params[:new_business_div].blank?

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

还有我的 3 个模型:

项目.rb

class Project < ActiveRecord::Base
  attr_accessible  :edited_first_name, :edited_last_name, :first_name, :last_name, :business_div, :client, :customer_benifits, :edited_date, :end_date, :entry_date,  :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech , :technols

validates_presence_of :business_div, :client, :customer_benifits, :end_date,  :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary




has_many :projecttechnols
has_many :technols, :through => :projecttechnols


def self.like(text); "%#{text}%"; end

  def self.search(search_client, search_industry, search_role, search_techs_ids, search_business_div, search_project_owner,  search_status, search_start_date_dd, search_start_date_A, search_start_date_B,  search_keywords)
    # start with a scoped query, to apply more scopes on it afterwards
    _projects = Project.scoped 
    # then, for each of the parameters, apply the scope only if present
    if search_client.present?
      _projects = _projects.where ['client LIKE ?', like(search_client)] 
    end
    if search_industry.present?
      _projects = _projects.where ['industry LIKE ?', like(search_industry)]
    end
    if search_role.present?
      _projects = _projects.where ['role LIKE ?', like(search_role)]
    end

#_projects = _projects.joins(:technols).
 #             where("technols.id" => search_techs_ids)



#_projects = _projects.joins(:projecttechnols).where("projecttechnols.id" => search_techs_ids)


if search_techs_ids.present?
_projects = _projects.joins(:technols).where("technols.id" => search_techs_ids)
end



    if search_business_div.present?
      _projects = _projects.where ['business_div LIKE ?', like(search_business_div)]
    end
    if search_project_owner.present?
      _projects = _projects.where ['project_owner LIKE ?', like(search_project_owner)]
    end

     if search_status.present?
      _projects = _projects.where ['status LIKE ?', like(search_status)]
    end



todays_date = DateTime.now.to_date

if !search_start_date_A.blank? or !search_start_date_B.blank?
    search_start_date_A = Date.parse(search_start_date_A).strftime("%Y-%m-%d")
    search_start_date_B = Date.parse(search_start_date_B).strftime("%Y-%m-%d")
    todays_date = nil
    search_start_date_dd = nil

    end

if search_start_date_dd.blank?
    todays_date = nil
end


if search_start_date_A.present? or search_start_date_B.present?

      _projects = _projects.where [' DATE(start_date) BETWEEN ? AND ?', search_start_date_A, search_start_date_B]
    end


                if search_start_date_dd.present?
      _projects = _projects.where ['DATE(start_date) BETWEEN ? AND ?', search_start_date_dd, todays_date]
    end




    if search_keywords.present?
      _projects = _projects.where ['keywords LIKE ?', like(search_keywords)]
    end
    # now you have applied only the present scopes. return the result, and watch 
    # the query as it executes.
    _projects
  end


def self.paginated_for_index(projects_per_page, current_page)
    paginate(:per_page => projects_per_page, :page => current_page)
  end

end

技术.rb

class Technol < ActiveRecord::Base
  attr_accessible :tech

has_many :projecttechnols
has_many :projects, :through => :projecttechnols
end

工程技术.rb

class Projecttechnol < ActiveRecord::Base
  attr_accessible :project_id, :technol_id

belongs_to :technol
belongs_to :project
end

这是新观点的一部分,我认为这是导致问题的原因:

<div class="tech">

<% common_techs = [['Mainframe'],['UNIX'],['Windows Servers'],['Networking'],['CISCO'], ['Win7'], ['Telephony'], ['Web services'], ['Website'], ['Cloud'], ['Virtualisation'], ['Data Centre']] %>
 <% db_techs = Technol.all.map {|p| [p.tech]}.uniq %>

<% all_tech = common_techs + db_techs %>


<%= form_for(@technol) do |tech| %>
<div class="field">
    <%= tech.label :tech %><br />
    <%= tech.text_field :tech %>
  </div>
<%end%>

当我单击提交按钮创建一个新项目时,我收到此错误:

    RuntimeError in ProjectsController#create

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

app/controllers/projects_controller.rb:116:in `block in create'
app/controllers/projects_controller.rb:112:in `each_value'
app/controllers/projects_controller.rb:112:in `create'

这些是我的参数:

    {"utf8"=>"✓",
 "authenticity_token"=>"sPyJbgBKTxa9iHWF9r0Gg/0R/v0l0/e8KwXpPebzdus=",
 "project"=>{"project_name"=>"",
 "status"=>"Active",
 "client"=>"",
 "business_div"=>"",
 "project_owner"=>"",
 "start_date"=>"01-10-2012",
 "entry_date"=>"2012-10-03",
 "end_date"=>"09-10-2012",
 "role"=>"",
 "industry"=>"",
 "summary"=>"",
 "lessons_learned"=>"",
 "customer_benifits"=>"",
 "financials"=>"",
 "keywords"=>""},
 "new_client"=>"",
 "new_business_div"=>"",
 "new_project_owner"=>"",
 "technol"=>{"tech"=>"TESTER"},
 "new_role"=>"",
 "new_industry"=>"",
 "commit"=>"Save New Project"}

我是 Rails 新手,所以在尝试帮助我时请记住这一点。所有帮助将不胜感激。提前致谢。

更新:

工作代码

def create
    @all_technols = Technol.all
    @project = Project.new(params[:project])

@technol = Technol.new(params[:tech])




params[:technol].each_value do |tech|

technology = Technol.find_or_create_by_tech(tech.strip)

@project_technol = @project.projecttechnols.build(:technol_id => technology.id)

end
4

1 回答 1

2

筛选所有内容有点困难,但每当您看到此消息时:

Called id for nil, which would mistakenly be ...

这意味着您尝试在未正确加载的对象上调用方法(在本例中为 .id)。如果我不得不猜测这将在您的创建操作中:

technology = Technol.find_by_tech(tech.strip)
  @project_technol = @project.projecttechnols.build(:technol_id => technology.id)
end

具体来说technology.id。你确定这条线:

technology = Technol.find_by_tech(tech.strip)

是否返回预期结果?如果将其替换为Technol.first是否会停止错误?如果是这样find_by_tech就失败了。

于 2012-10-03T15:43:46.640 回答