2017-02-03 3 views
1

Ich bin verwirrt mit der Art und Weise, wie Sie jede URL wie deals /: id/properties /: id trotz einer Eins-zu-eins-Verbindung zwischen einem Deal und einer Eigenschaft bekommen können. Wie kommt es, dass ich in der Browser-URL deals/2/properties/14 eingeben kann (oder eine beliebige Kombination davon), wenn die mit deal 2 verknüpfte Eigenschaft die Eigenschaft 6 in meiner Datenbank ist. Die Links, die ich in den Ansichten habe, funktionieren und ich bekomme die richtigen Assoziationen/2/properties/6 über die Links, aber meine Frage ist da etwas, was ich falsch im Setup (oder überall sonst) gemacht habe oder ist das nur Rails erlaubt alles möglich Kombination, die im Browser getestet werden soll ... Wenn ja, gibt es eine Möglichkeit dies zu verhindern? Vielen DankWarum hat has_one Assoziation mit verschachtelten Routen Zugriff auf alle möglichen Routen in der URL-Suchleiste?

Ich habe eine eins-zu-eins-Assoziation => 1 Deal hat eine Eigenschaft und eine Eigenschaft gehört zu behandeln. Ich habe Routen verschachtelt wie

resources :deals, only: [:index, :show, :create, :update, :destroy] do 
     scope '/siteadmin' do 
     resources :properties 
     end 
    end 

    scope '/siteadmin' do 
     resources :deals, except: [:index, :show] 
    end 

deal.rb folgt

class Deal < ApplicationRecord 
     has_one :property, dependent: :destroy 
     accepts_nested_attributes_for :property 
    end 

property.rb

class Property < ApplicationRecord 
     belongs_to :deal 
     validates :full_address, presence: true 
     validates_uniqueness_of :deal_id 
    end 

deals_controller.rb

 class DealsController < ApplicationController 
     before_action :set_deal, only: [:show, :edit, :update, :destroy] 
     def index 
     @deals = Deal.all 
     end 
     def show 
     @property = @deal.property 
     end 
     def new 
     @deal = Deal.new 
     end 
     def create 
     @deal = Deal.new(deal_params) 
     if @deal.save 
      redirect_to deals_path, notice: 'Deal was successfully created' 
     else 
     render :new 
     end 
     end 
     def edit 
     end 
     def update 
     if @deal.update(deal_params) 
      redirect_to @deal, notice: 'Deal was successfully updated' 
     else 
      flash.now[:alert] = "Deal has not been updated." 
      render :edit 
     end 
     end 
     def destroy 
     @deal.destroy 
     redirect_to deals_path, notice: 'Deal was successfully deleted' 
     end 

     private 
     def deal_params 
     params.require(:deal).permit(:description, :kind, :address, :image_url, :occupancy, :yield) 
     end 
     def set_deal 
     @deal = Deal.find(params[:id]) 
     rescue ActiveRecord::RecordNotFound 
     flash[:alert] = "The deal you were looking for could not be found." 
     redirect_to deals_path 
     end 
    end 

properties_controller.rb

class PropertiesController < ApplicationController 
    before_action :set_deal 
    before_action :set_property, only: [:show, :edit, :update, :destroy] 

    def index 
     @properties = Property.all.order(id: :asc) 
    end 

    def show 
    end 

    def new 
     @property = @deal.build_property 
    end 
    def create 
     @property = @deal.build_property(property_params) 
     if @property.save 
     flash[:notice] = "Property has been created." 
     redirect_to [@deal, @property] 
     else 
     flash.now[:alert] = "Property has not been created." 
     render "new" 
     end 
    end 
    def edit 
    end 

    def update 
     if @property.update(property_params) 
     flash[:notice] = "Property has been updated." 
     redirect_to [@deal, @property] 
     else 
     flash.now[:alert] = "Property has not been updated." 
     render "edit" 
     end 
    end 
    def destroy 
     @property.destroy 
     flash[:notice] = "Property has been deleted." 
     redirect_to @deal 
    end 
    private 
    def property_params 
     params.require(:property).permit(:genre, :surface, :nb_rooms, :nb_bedrooms, :city, :district, :full_address) 
    end 
    def set_property 
     @property = Property.find(params[:id]) 
    end 
    def set_deal 
     @deal = Deal.find(params[:deal_id]) 
    end 
    end 

Angebote show.html.erb

<h2>Property in the deal:</h2> 
<ul class="list-unstyled text-justify"> 
    <li>Property id #<%= @deal.property.try(:id) %> - <%= link_to @deal.property.try(:full_address), [@deal, @property] %></li> 
    <li>Adresse of the property: <%= @deal.property.try(:full_address) %></li> 
    <li><%= link_to "see all the properties", deal_properties_path(@deal) %></li> 
    <%= link_to "add deal", new_deal_path, {class: "btn btn-primary"} %> 
</ul> 

Eigenschaften index.html.erb

 <header> 
     <h2>All properties</h2> 
     <ul id="properties in the db"> 
     <% @properties.each do |property| %> 
     <li>Property id #<%= property.id %> - <%= link_to property.full_address, deal_property_path(property.deal, property) %></li> 
     <li><%= link_to "See our Deal", deal_path(property.deal) %></li> 
     <li><%= link_to "Edit Property", edit_deal_property_path(property.deal, property) %></li> 
     <li>Deal id #<%= property.deal.id %></li> 
     <% end %> 
     <br> 
     </ul> 
     <ul class="actions"> 
     <li><%= link_to "Add Property", new_deal_property_path(@deal), 
      class: "new" %></li> 
     <li><%= link_to "Back to deals", deals_path%></li> 
     </ul> 
    </header> 

Eigenschaften show.html.erb

<header> 
    <h2>Property id #<%= @property.id %> <%= @property.full_address %></h2> 
    </header> 
    <h3>This is the property #<%= @property.id %> of the Deal @<%= @deal.id %> - <%= @deal.address %></h3> 
    <p>This property is located at <%= @property.full_address %></p> 
    <li><%= link_to "See all the properties", deal_properties_path(@deal)%></li> 

Antwort

0

die Routen behandelt nur die Format der Abfragezeichenfolge nicht die Werte darin.

, was ich tun Umfang sind die Daten in der Steuerung wie diese

class PropertiesController < ApplicationController 
    before_action :set_deal 
    before_action :set_property, only: [:show, :edit, :update, :destroy] 

    def index 
     @properties = Property.all.order(id: :asc) 
    end 

    def show 
    end 

    def new 
     @property = @deal.build_property 
    end 
    def create 
     @property = @deal.build_property(property_params) 
     if @property.save 
     flash[:notice] = "Property has been created." 
     redirect_to [@deal, @property] 
     else 
     flash.now[:alert] = "Property has not been created." 
     render "new" 
     end 
    end 
    def edit 
    end 

    def update 
     if @property.update(property_params) 
     flash[:notice] = "Property has been updated." 
     redirect_to [@deal, @property] 
     else 
     flash.now[:alert] = "Property has not been updated." 
     render "edit" 
     end 
    end 
    def destroy 
     @property.destroy 
     flash[:notice] = "Property has been deleted." 
     redirect_to @deal 
    end 
    private 
    def property_params 
     params.require(:property).permit(:genre, :surface, :nb_rooms, :nb_bedrooms, :city, :district, :full_address) 
    end 
    def set_property 
     @property = @deal.property #.find(params[:id]) # you don't need to find it because there is only 1 
    end 
    def set_deal 
     @deal = Deal.find(params[:deal_id]) 
    end 
    end 
+0

Sie Jose Vielen kann ich jetzt sehen, dass das, was die URL ich versuche, es zu geben die richtige Deal-Eigenschaftskombination immer zeigen, was auch immer die URL Vielen Dank, dass Sie mich in die richtige Richtung weisen. – nicodo

+0

Ich bin froh, dass ich helfen konnte –

+0

getan - Entschuldigung war meine erste Frage überhaupt :) – nicodo

Verwandte Themen