内存中的对象可以在 Rails 中进行关联吗?非传统形式视图

Posted

技术标签:

【中文标题】内存中的对象可以在 Rails 中进行关联吗?非传统形式视图【英文标题】:Can an in memory object take associations in Rails? Non-traditional form view 【发布时间】:2014-07-15 21:47:25 【问题描述】:

我在 Rails 视图中提交和显示数据时遇到结构性问题。对于我的项目创建视图,用户可以向项目添加技能要求。但是,该项目仅存在于内存中,因此当我在技能控制器的创建操作中为其分配技能时,我遇到了错误。此外,当创建操作将一个重定向到项目新表单时,内存会丢失。因此,我不太确定能够将内存中的项目对象与技能对象相关联是否有帮助。

谁能告诉我如何将技能分配给仅存在于内存中的项目?或者创建一个技能集合,在用户单击添加技能时显示该集合,然后在用户单击“创建”的项目创建操作中将这些技能集合分配给项目,以创建项目?

型号:

class Project < ActiveRecord::Base
  has_many :requirements
  has_many :skills, through: :requirements
end

class Skill < ActiveRecord::Base
  has_many :requirements
  has_many :projects, through: :requirements
end

class Requirement < ActiveRecord::Base
  belongs_to :project
  belongs_to :skill
end

控制器:

class SkillsController < ApplicationController
  def create

    if params[:project] && Skill.where(name: params[:skill][:name]) != []
      skill = Skill.where(name: params[:skill][:name]).first
      @project_skills = []
      @project_skills << skill
    else
      skill = Skill.create(name: params[:skill][:name]) if params[:skill][:name]
      @project_skills = []
      @project_skills << skill
    end
end

class OrganizationAdmin::ProjectsController < OrganizationAdminController
  before_action :find_organization, only: [:create]

  def new
    @project = Project.new(organization_id: params[:organization_id])
    @skill = Skill.new
    @all_skills = Skill.all
    @project_skills
  end

  def create
    @project = Project.new(project_params)
    if @project.save
      @project.update_columns(state: "open", causes: @organization.cause)
      creates_a_newsfeed_item_for_the_project(@project)
      flash[:notice] = "You successfully created a project"
      redirect_to project_path(@project.id)
    else
      render :new
    end
  end

观看次数

%section#form.register
  .row.row-custom
    .col-lg-10.col-project-form
      = form_for [:organization_admin, @project], html: class: 'form-horizontal' do |f|
        %h1 Create a Project
        %fieldset
          .row
            .col-lg-5
              .form-group#deadline
                %label.control-label.col-lg-3 Deadline
                .col-lg-9.project-gen-input-fix
                  = f.date_select(:deadline, :order => [:month, :day, :year])
            .col-lg-3
              .form-group#hours
                %label.control-label.col-lg-8:for => "estimated-hours" Estimated Hours
                .col-lg-4
                  = f.text_field :estimated_hours, class: "form-control input-sm"
          .form-group
            %label.control-label.col-lg-2 Project Title
            .col-lg-10
              = f.text_field :title, class: "form-control"
              = hidden_field_tag :skills, @project_skills
          .form-group
            %label.control-label.col-lg-2 Description
            .col-lg-10
              = f.text_area :description, cols: 6, rows: 6, class: "form-control"
            = f.hidden_field :organization_id
          .form-group
            = f.submit "Create", class: "btn btn-lg btn-primary pull-right"
      = form_for @skill, url: skills_path do |f|
        %div.edit-input-wrapper
          = f.label :skill_requirements
          = f.text_field :name, data: autocomplete_source: skill_set(@all_skills)
          = hidden_field_tag :project, @project
        = f.submit "Add Skill", class: "btn btn-success", id: "edit-submit"
      %ul
        - @project_skills.each do |type|
          %li= type.name
    .col-lg-2
      %p#form-tip <strong>Tip</strong>: The dreams of yesterday are the hopes of today and <a href="#">the reality of tomorrow</a>.

【问题讨论】:

在尝试为其分配技能之前,只需保存您的@project 这是一个非常好的主意。但是,我认为我将不得不创建一个名为 Draft 的新对象。为了成为 RESTful,只有在项目控制器中点击创建操作时才能创建项目 【参考方案1】:

为了跟进这个问题,我在项目表单上创建了两个按钮:一个用于保存草稿,另一个用于发布项目。在创建项目操作中,我检测提交参数单击了哪个按钮。但是,为了向项目或草稿添加技能,我必须在页面上创建另一个表单。但是,这种添加技能形式仍然适用于相同的项目操作。

保存草稿时,会创建一个项目,但不会发布到项目索引。每次我保存草稿时,我都会返回到项目的新操作,传递适当的参数以继续使用准确的输入呈现表单。添加技能也会发生同样的事情。

然而,一个新的问题出现了。我需要对我的项目创建操作进行一些重大重构。我创建了一个SO question,看看是否有人对减少此操作有建议。

【讨论】:

以上是关于内存中的对象可以在 Rails 中进行关联吗?非传统形式视图的主要内容,如果未能解决你的问题,请参考以下文章

如何正确关联rails中的对象而不为相关性制作单独的表

如何根据 Rails 中的其他对象验证多对多关联?

Ruby on Rails 中的表关联

在 Rails 中连接关联的按钮不起作用。所有权转让

为啥 Ruby on Rails 不使用 .includes() 加载我的关联对象?

ruby on rails 固定装置中的自动关联