0

나는 3 가지 모델을 가지고 있습니다.레일이 중첩 된 형태로 많은 사람들이 예상대로 작동하지 않음

이러한 모델 간의 관계는 많은 관계가 있습니다.

단위 모델

has_many :unitrentperiods, inverse_of: :unit 
    has_many :rentperiods, :through => :unitrentperiods 

accepts_nested_attributes_for :unitrentperiods 

unitrentperiod 모델

belongs_to :unit 
    belongs_to :rentperiod 

rentperiod 모델

has_many :unitrentperiods, inverse_of: :rentperiod 
    has_many :units, :through => :unitrentperiods 

와 나는 새로운 장치를 만들거나 장치를 편집 할 수있는 단위 형태를 가지고있다. 나뿐만 아니라, 그래서 내가 내 단위 형태가 사람들을 표시 할

"6 months" 
"12 months" 

추천 임대 기간을 말할 수 내 "unitrentperiod을"관리 내 단위 형태는 단지 내 장치를 관리 할 수 ​​있지만 수 없습니다 만들고 싶어 가격 입력이 또한 기간 임대, 그래서 난 내 단위 양식을 저장할 때, 나는 또한 데이터베이스의 임대 기간에 따라 2 unitrentperiod을 저장, 난 내보기에 이런 짓을 :

<style> 
    .divCB { 
    margin-right: 10px 
    } 
</style> 










<%= form_for(@unit) do |f| %> 
    <% if @unit.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@unit.errors.count, "error") %> prohibited this unit from being saved:</h2> 

     <ul> 
     <% @unit.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 


<% end %> 


    <div class="page-header"> 
     <div class="row"> 
      <div class="col-md-7"> 
       <h1 class="h2 page-title">Manage Unit</h1> 
       <div class="text-muted page-desc"></div> 
      </div> 
      <div class="col-md-5 charts"> 
       <div class="row"> 

       </div> 
      </div> 
     </div> 
    </div> 
    <!-- Breadcrumb --> 
    <ol class="breadcrumb"> 

     <li class="active">Manage Unit</li> 
     <!-- Breadcrumb Menu--> 

    </ol> 

<div class="container-fluid"> 
     <div class="animated fadeIn"> 

      <!--/.row--> 
      <div class="row"> 
       <div class="col-md-6"> 
        <div class="card"> 
         <div class="card-header"> 
          <strong>Unit Form</strong> 
         </div> 

         <%= form_for @unit, html: {class: "form-horizontal"} do |f| %> 
         <div class="card-block"> 




           <div class="form-group row"> 
            <%= f.label 'Apartement', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 
             <%= collection_select(:unit, :apt_id, @apts, :id, :apt_name, {:prompt => "Please select an Apartement"}, {:id => 'apartements_select', :class => "select", :style => "width:240px"}) %> 


            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Tower', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 


             <%= collection_select(:unit, :tower_id, @towers, :id, :tower_name, {:prompt => "Select a Tower"}, {:id => 'towers_select', :class => "select", :style => "width:240px"}) %> 
            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Unit number', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

             <%= f.text_field :unitno, class: "form-control" %> 

            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Unit size', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

             <%= f.text_field :unitsize, class: "form-control" %> 

            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Unit view', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.select :unitview, options_for_select(@unit_views.collect { |s| [s[0].humanize, s[0]] }, selected: @unit.unitview), {} , class: "form-control" %> 

            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Room Type', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 


              <%= collection_select(:unit, :room_type_id, @roomtypes, :id, :room_type_desc, {:prompt => false}, class: "form-control") %> 

            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Unit floor', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.text_field :unitfloor, class: "form-control" %> 
            </div> 
           </div> 


           <div class="form-group row"> 
            <%= f.label 'Unit description', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.text_field :unitdesc, class: "form-control" %> 
            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Total bed', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.text_field :totalbedroom, class: "form-control" %> 
            </div> 
           </div> 


           <div class="form-group row"> 
            <%= f.label 'Furnish', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.select :furnish, options_for_select(@furnish_types.collect { |s| [s[0].humanize, s[0]] }, selected: @unit.furnish), {} , class: "form-control" %> 

            </div> 
           </div> 


           <div class="form-group row"> 
            <%= f.label 'For sell', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.select :isforsell, options_for_select([ ['No', 0], ['Yes', 1] ], selected: @unit.isforsell), {} , class: "form-control" %> 
            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Sell price', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.text_field :sellprice, class: "form-control" %> 
            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'For rent', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

              <%= f.select :isforrent, options_for_select([ ['No', 0], ['Yes', 1] ], selected: @unit.isforrent), {} , class: "form-control" %> 
            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Rent price', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 
             <table> 
              <% @rentperiods.each do |rentperiod| -%> 

              <tr> 
               <td><%= rentperiod.rentmonth %> Month</td> 
               <td> 
                <%= fields_for(@unitrentperiods) do |elem| %> 
                 <%= elem.text_field :rentprice, class: 'col-md-4 form-control' %> IDR 
                 <%= elem.hidden_field :rentperiod_id, :value => rentperiod.id %> 


                <% end %> 
               </td> 
              </tr> 
              <% end -%> 

              </table> 




            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Unit status', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

             <%= f.select :unitstatus, options_for_select(@unit_statuses.collect { |s| [s[0].humanize, s[0]] }, selected: @unit.unitstatus), {} , class: "form-control" %> 

            </div> 
           </div> 


           <div class="form-group row"> 
            <%= f.label 'Photo Template', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 


             <%= f.select :template_id, options_for_select(@templates.collect { |s| [s[:type], s[:id]] }, selected: @unit.template_id), {} , class: "form-control" %> 

            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Floor plan', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

             <div id="divFloorplan"> 


             </div> 
            </div> 
           </div> 

           <div class="form-group row"> 
            <%= f.label 'Unit plan', class: 'col-md-4 form-control-label' %> 
            <div class="col-md-8"> 

             <div id="divUnitplan"> 


             </div> 
            </div> 
           </div> 






         </div> 
         <div class="card-footer"> 
          <button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-dot-circle-o"></i> Submit</button>  
         </div> 
         <% end %> 
        </div> 

       </div> 
       <!--/col--> 
      </div> 
      <!--/.row--> 
     </div> 
</div> 


<script> 
    $(document).ready(function() 
    { 
      $('.select').select2(); 

      $('#apartements_select').change(function() { 

       $.ajax({ 
          url: "/units/gettowers", 
          data: { 
          apt_id : $('#apartements_select').val() 
          }, 
          dataType: "script" 
         }); 


        $.ajax({ 
          url: "/units/getfloorplans", 
          data: { 
          apt_id : $('#apartements_select').val() 
          }, 
          dataType: "script" 
         }); 

        $.ajax({ 
          url: "/units/getunitplans", 
          data: { 
          apt_id : $('#apartements_select').val() 
          }, 
          dataType: "script" 
         }); 





      }); 

    }); 
</script> 

컨트롤러

class UnitsController < ApplicationController 
    before_action :set_unit, only: [:show, :edit, :update, :destroy] 

    # GET /units 
    # GET /units.json 
    def index 
    @units = Unit.paginate(page: params[:page]) 
    end 

    # GET /units/1 
    # GET /units/1.json 
    def show 
    end 

    def gettowers 
    # updates towers based on apartement selection 
    tower = Tower.where(:apt_id => params[:apt_id]) 
    # map to name and id for use in our options_for_select 
    @towers = tower.map{|a| [a.tower_name, a.id]}.insert(0, "Select a Tower") 
    end 

    def getfloorplans 
    floorplans = Floorplan.where(:apt_id => params[:apt_id]).select("id, floorplanphoto") 
    @imgs = floorplans 
    end 

    def getunitplans 
    unitplans = Unitplan.where(:apt_id => params[:apt_id]).select("id, unitplanphoto") 

    @imgs = unitplans 
    end 

    def preparedata 
    #master tables 
    @apts = Apt.all 
    @towers = Tower.all 
    @roomtypes = RoomType.all 
    @rentperiods = Rentperiod.all 

    array = [] 
    Template.all.each do |t| 
     hash = { :type => t.room_type.room_type_desc, :id => t.id } 
     array.push(hash) 
    end 

    @templates = array 

    #enum from model 
    @unit_views = Unit.unitviews 
    @furnish_types = Unit.furnishes 
    @unit_statuses = Unit.unitstatuses 
    end 

    # GET /units/new 
    def new 
     @unit = Unit.new 
     @unitrentperiods = @unit.unitrentperiods.build 

     preparedata 



     # @rentperiods.each do |r| 
     # @unit.unitrentperiods.build 
     # end 
    end 

    # GET /units/1/edit 
    def edit 
    #@unitrentperiods = @unit.unitrentperiods 
    @unitrentperiods = @unit.unitrentperiods.build 
    preparedata 
    end 

    # POST /units 
    # POST /units.json 
    def create 
    @unit = Unit.new(unit_params) 

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

    # PATCH/PUT /units/1 
    # PATCH/PUT /units/1.json 
    def update 
    respond_to do |format| 
     if @unit.update(unit_params) 
     format.html { redirect_to @unit, notice: 'Unit was successfully updated.' } 
     format.json { render :show, status: :ok, location: @unit } 
     else 
     format.html { render :edit } 
     format.json { render json: @unit.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /units/1 
    # DELETE /units/1.json 
    def destroy 
    @unit.destroy 
    respond_to do |format| 
     format.html { redirect_to units_url, notice: 'Unit was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_unit 
     @unit = Unit.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def unit_params 
     params.require(:unit).permit(:apt_id, :tower_id, :unitno, :unitsize, :unitview, 
            :room_type_id, :unitfloor, 
            :unitdesc, :isforsell, :sellprice, :isforrent, :furnish, :totalbedroom, 
            :unitstatus, :template_id, :floorplan_id, :unitplan_id, 
            unitrentperiods_attributes: [:rentprice, :rentperiod_id]) 
    end 
end 

어떻게 든 작동하지 않습니다. 내가 뭐 놓친 거 없니? 그것을 만들기 위해 어떤 가이드가 필요합니다. 당신이 경우

답변

0

처음에는 당신이 중첩 된 속성에 동의하지 않을 권리 또한 has_many :unitrentperiods

아래

accept_nested_attributes_for :unitrentperiods 

를 추가, 당신은 attr_accessible을 중첩 된 속성 매개 변수를 허용하는 강력한 매개 변수를 구성해야합니다 (또는 수 on Rails 3).

여기 Gotcha : unitrentperiods_attributes을 허용해야합니다. unitrentperiods이 아닙니다.

+0

감사합니다. 컨트롤러의 강력한 매개 변수로 모델을 업데이트하고 중첩 된 특성을 허용하여 모델을 업데이트했습니다. – NomNomNom

+0

지금까지 올바른 것으로 보았습니다 ... 아마도'update' 액션에 문제가 있습니까? – shlajin

+0

컨트롤러 컨트롤러와 전체 form_for를 제공하여 완벽한 컨트롤러 및 전체보기로 업데이트 – NomNomNom