سؤال

لست متأكدا إذا كنت أقرأ هذا صحيح، ولكن يبدو أن Scaffold لن تقوم بعلاقة رأس بأطراف في مجملها.على سبيل المثال، إذا قمت بإنشاء messages مع سقالة ثم أريد comments على تلك messages (واحد message -> كثيرة comments) ، لا بد لي من المرور وتغيير كل شيء.على سبيل المثال، لا بد لي من تغيير هذا في commentnew منظر

<% form_for(@comment) do |f| %>

الى هذا

<% form_for([@message, @comment]) do |f| %>

ثم قم بتغيير الإجراء لإعداد @message فار...من بين أمور أخرى.

لا يمكن حاليًا القيام بذلك تلقائيًا باستخدام Scaffold، أليس كذلك؟

هل كانت مفيدة؟

المحلول

وهذا صحيح، ولكن هذه ليست نهاية القصة.هناك بديلان على الأقل لـ Scaffold يعملان بشكل جيد ويلتقطان تلقائيًا العلاقات بين الفئات (استنادًا إلى مؤشرات علاقة ActiveRecord مثل has_many).أحد هذه البدائل هو مبسطة والآخر هو ActiveScaffold.

إنها مفيدة بشكل أساسي لإدخال البيانات التي يتطلبها نظامك والتي ليست بيانات يدخلها المستخدم.على سبيل المثال، أستخدمها للمهام الإدارية على الجداول حيث لا فائدة من إنشاء واجهة مستخدم كاملة لـ CRUD عندما يقوم أحد بدائل السقالة بالمهمة بشكل جيد لميزة نادرًا ما يتم استخدامها.ومع ذلك، لن ترغب في استخدامها للتعليق على الرسائل.

نصائح أخرى

نعم.تعمل السقالة مع النموذج ووحدة التحكم ذات الصلة.لا يهتم بالعلاقات أو يعمل معها.

الهدف الأساسي لـ Scaffold هو تشغيل CRUD على نموذج باستخدام وحدة التحكم وطرق العرض ذات الصلة.هذا كل شئ.أي متطلبات أخرى مثل العلاقات يجب أن يتم ترميزها يدويًا.

لاحظ أن هناك مشاريع مثل المتشرد لـ Rails الذي يسمح لك بالحفاظ على حقولك وارتباطاتك داخل النموذج نفسه.لا يمكنك دعم الجمعيات، لكنها قريبة جدًا.

ينتهي بك الأمر إلى دفع ثمن هذا السكر من خلال إنشاء الكثير من التطبيقات خلف ظهرك.بدلاً من طرح سلوكياتك الخاصة، عادةً ما تقوم بطرح ما تحتاجه من بنك كبير من السلوكيات المعدة مسبقًا.

لا تحتاج إلى إطار عمل إداري ثقيل لتشغيل العلاقات بين طرفين.

يمكنك استخدام السقالات للوصول إلى معظم الطريق.

المزيد من العمل في وحدة التحكم وعرض _form سيوصلك إلى بقية الطريق.

إليك الطريقة...

Story: Select a beer for a developer

In order to select a beer for a developer
As an admin
I want a mainly scaffolded interface to select that beer

Scenario 1: Select beer for new developer
Given I have clicked the <new> button  and entered the developer's name
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>

Scenario 2: Select a different beer for existing developer
Given I have clicked the <edit> button on the index page for a particular developer
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>

لنفترض أن لدينا أ بيرة طاولة:

  create_table "beers", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

و أ المطورين الجدول الذي يحتوي على مفتاح خارجي (beer_id) يشير إلى جدول البيرة:

  create_table "developers", force: true do |t|
    t.string   "name"
    t.integer  "beer_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

يمكننا استخدام السقالات لإنشاء كلا الجدولين:

$ القضبان ز سقالة اسم البيرة

اسم مطور السقالة $ Rails g beer_id:integer

يقوم أمر السقالة بإنشاء وحدات التحكم وطرق العرض لكل نموذج.

سنحتاج إلى تعديل وحدات التحكم وطرق العرض الخاصة بنا قليلاً للحصول على القائمة المنسدلة لتحديد نوع البيرة لكل مطور:

app/views/developers/_form.html.erb

استبدل text_field الذي تم إنشاؤه والتسمية لـ beer_id بما يلي:

  <div class="field">
    <%= f.label :beer_id %><br />
    <%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %> 
  </div>

app/controllers/developer_controller.rb

تحرير أساليب وحدة التحكم الجديدة والتحرير:

  # GET /developers/new
  def new
    @developer = Developer.new
    @beers = Beer.all
    respond_to do |format|
      format.html # new.html.erb
    end
  end


  # GET /developers/1/edit
  def edit
    @beers = Beer.all
    respond_to do |format|
      format.html # new.html.erb
    end    
  end

لقطات الشاشة

enter image description here

enter image description here

enter image description here

ملحوظات

سقالات القضبان رائعة.انظر إلى جميع الملفات التي يقوم بإنشائها لك:

$ be rails g scaffold beer name
      invoke  active_record
      create    db/migrate/20140912144218_create_beers.rb
      create    app/models/beer.rb
      invoke    rspec
      create      spec/models/beer_spec.rb
      invoke      factory_girl
      create        spec/factories/beers.rb
      invoke  resource_route
       route    resources :beers
      invoke  scaffold_controller
      create    app/controllers/beers_controller.rb
      invoke    erb
      create      app/views/beers
      create      app/views/beers/index.html.erb
      create      app/views/beers/edit.html.erb
      create      app/views/beers/show.html.erb
      create      app/views/beers/new.html.erb
      create      app/views/beers/_form.html.erb
      invoke    rspec
      create      spec/controllers/beers_controller_spec.rb
      create      spec/views/beers/edit.html.erb_spec.rb
      create      spec/views/beers/index.html.erb_spec.rb
      create      spec/views/beers/new.html.erb_spec.rb
      create      spec/views/beers/show.html.erb_spec.rb
      create      spec/routing/beers_routing_spec.rb
      invoke      rspec
      create        spec/requests/beers_spec.rb
      invoke    helper
      create      app/helpers/beers_helper.rb
      invoke      rspec
      create        spec/helpers/beers_helper_spec.rb
      invoke    jbuilder
      create      app/views/beers/index.json.jbuilder
      create      app/views/beers/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/beers.js.coffee
      invoke    scss
      create      app/assets/stylesheets/beers.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

كل ما عليك فعله هو معرفة الملفات التي تريد تعديلها عندما تريد أكثر من عمليات CRUD الأساسية.

امل ان يساعد.~ ليكس

السقالات هي السقالات.عندما تريد أي شيء آخر غير CRUD على الطاولة (وهو ما تفعله/تفعله السقالة)، فأنت بحاجة إلى تغيير كود السقالة الذي تم إنشاؤه، أو إنشاء كود خاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top