2014-07-15 1 views
0

레일 뷰에서 데이터를 제출하고 표시하는 데 구조적인 문제가 있습니다. 내 프로젝트 작성보기의 경우 사용자는 프로젝트에 기술 요구 사항을 추가 할 수 있습니다. 그러나 프로젝트는 메모리에만 존재하므로 스킬 컨트롤러의 생성 동작에서 스킬을 할당하면 오류가 발생합니다. 게다가, create 액션이 새로운 것을 프로젝트로 리디렉션하면 메모리가 손실됩니다. 따라서 메모리 프로젝트 오브젝트와 스킬 오브젝트를 연관시킬 수 있다면 도움이 될지 모르겠다.메모리 객체가 레일스에서 ​​연관성을 가질 수 있습니까? 비 전통적인 형식보기

메모리에서 밖에 나가는 프로젝트에 기술을 할당하는 방법을 보여줄 수 있습니까? 또는 기술 모음을 만들고 사용자가 기술 추가를 클릭 할 때 해당 모음을 표시 한 다음 사용자가 프로젝트를 만들기 위해 "만들기"를 클릭하면 프로젝트 작성 작업의 프로젝트에 이러한 기술 수집을 할당 할 수 있습니까?

모델 :

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>. 
+0

스킬을 할당하기 전에'@ project'를 저장하십시오. – meagar

+0

그건 아주 좋은 생각입니다. 그러나 Draft라는 새로운 객체를 만들어야한다고 생각합니다. RESTful이 되려면 프로젝트 컨트롤러에서 create 액션을 눌렀을 때만 프로젝트를 생성 할 수있다. – robertjewell

답변

0

이 QUES에 후속 프로젝트 양식에 초안을 저장하고 프로젝트를 게시하기위한 두 개의 버튼을 만들었습니다. 프로젝트 생성 액션에서 커밋 매개 변수에 의해 클릭되는 버튼을 감지합니다. 그러나 프로젝트 또는 초안에 기술을 추가하기 위해 페이지에 다른 양식을 만들어야했습니다. 그러나이 스킬 추가 양식은 여전히 ​​동일한 프로젝트 작업으로 이어집니다.

초안이 저장되면 프로젝트가 생성되지만 프로젝트 인덱스에는 게시되지 않습니다. 초안을 저장할 때마다 프로젝트의 새로운 작업으로 돌아가 정확한 매개 변수를 전달하여 양식을 정확한 입력으로 유지합니다. 기술을 추가 할 때도 마찬가지입니다.

그러나 새로운 문제가 발생했습니다. 프로젝트를 만들 때 중요한 리팩토링을해야합니다. SO question을 작성하여이 작업의 thin아 내기에 대한 제안 사항이 있는지 확인하십시오.

관련 문제