나는 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
어떻게 든 작동하지 않습니다. 내가 뭐 놓친 거 없니? 그것을 만들기 위해 어떤 가이드가 필요합니다. 당신이 경우
감사합니다. 컨트롤러의 강력한 매개 변수로 모델을 업데이트하고 중첩 된 특성을 허용하여 모델을 업데이트했습니다. – NomNomNom
지금까지 올바른 것으로 보았습니다 ... 아마도'update' 액션에 문제가 있습니까? – shlajin
컨트롤러 컨트롤러와 전체 form_for를 제공하여 완벽한 컨트롤러 및 전체보기로 업데이트 – NomNomNom