内存中的对象可以在 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 中进行关联吗?非传统形式视图的主要内容,如果未能解决你的问题,请参考以下文章