2016-06-17 2 views
0

Meine Modelle sind wie folgt;Rails: So speichern Sie die übergeordneten Daten im untergeordneten Modell (Zuordnung)

Modelle

shop.rb

class Shop < ActiveRecord::Base 
    belongs_to :order 
    has_many :items 
    has_many :categories 
end 

item.rb

class Item < ActiveRecord::Base 
    belongs_to :shop 
    has_many :categories 
end 

Wie kann ich abrufen und speichern Sie die shop_id im Item wenn ich item Daten speichern?

Obwohl ich denke, so etwas wie @item.shop funktioniert, weiß ich nicht, wie man es anwendet.

Schema

ActiveRecord::Schema.define(version: 20160615060137) do 

... 

    create_table "shops", force: :cascade do |t| 
    t.string "name" 
    t.integer "order_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "items", force: :cascade do |t| 
    t.string "name" 
    t.integer "shop_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

... 

end 

items_controller.rb

class ItemsController < ApplicationController 

    def new 
    @item = Item.new 
    end 

    def create 
    @item = Item.new(item_params) 
    if @item.save 
     flash[:success] = "item created!" 
     redirect_to root_url 
    else 
     render 'new' 
    end 
    end 

    private 

    def item_params 
     params.require(:item).permit(:name, :shop_id) 
    end 

end 

views/Artikel/new.html.erb

<%= form_for(@item) do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    <br> 
    <%= f.submit "Post" %> 
<% end %> 

Es wäre schön, wenn Sie mir einen Vorschlag machen könnten.

Antwort

1

Sie können es auf 3 Arten tun,

Schmutzige: fügen ein hidden_fieldshop_id im item/_form benannt und die hidden_field auf Ihren Wert zuweisen.

Am besten: Verschachteltes Objekt erstellen. In der Routendatei tun:

resources :shops do 
resources :items 
end 

Es wird ein new Artikel Weg wie root_url/shops/1/items/new erzeugen. so können Sie erhalten die shop_id

ODER

Sie können die new Item-Objekt mit einem shop wie create:

def new 
    @shop = Shop.find(params[:shop_id]) 
    @item = @shop.items.new 
end 
+0

Vielen Dank für Ihre schnelle Antwort, @Emu. Obwohl es funktioniert, wenn ich die URL direkt nach dem Hinzufügen Ihrer Antwort in der 'routes.rb' eingegeben habe, wurde der folgende Fehler angezeigt, als ich <% = link_to" Ereignis hinzufügen ", new_shop_item_path%>' in der 'shop.html hinzufügte .erb'. Der Fehler ist 'ActionController :: UrlGenerationError in ShopsController # show' und' No route matches {: action => "new",: controller => "items",: id => "23"} fehlende Schlüssel: [: shop_id ] '. – SamuraiBlue

+1

Es funktioniert nach der Bearbeitung wie folgt, @Emu. Vielen Dank für Ihre Zeit. '<% = link_to" Artikel hinzufügen ", new_shop_item_path (shop)'. – SamuraiBlue

+0

@SamuraiBlue, Sie sind herzlich willkommen. :) – Emu

Verwandte Themen