পশুর সাথে has_many সঙ্গে ফর্ম নিস্ট করা: মাধ্যমে, কীভাবে যোগদানের মডেলের বৈশিষ্ট্যগুলি সম্পাদনা করবেন?


103

গ্রহণযোগ্য_নক্ষিত_অযুক্তি_বিযুক্তি ব্যবহার করার সময় আপনি কীভাবে যোগদানের মডেলটির বৈশিষ্ট্যগুলি সম্পাদনা করবেন?

আমার কাছে 3 টি মডেল রয়েছে: লিঙ্কারদের সাথে যুক্ত টপিক এবং নিবন্ধগুলি

class Topic < ActiveRecord::Base
  has_many :linkers
  has_many :articles, :through => :linkers, :foreign_key => :article_id
  accepts_nested_attributes_for :articles
end
class Article < ActiveRecord::Base
  has_many :linkers
  has_many :topics, :through => :linkers, :foreign_key => :topic_id
end
class Linker < ActiveRecord::Base
  #this is the join model, has extra attributes like "relevance"
  belongs_to :topic
  belongs_to :article
end

সুতরাং যখন আমি বিষয়গুলি নিয়ামকের "নতুন" ক্রিয়ায় নিবন্ধটি তৈরি করি ...

@topic.articles.build

... এবং বিষয়গুলিতে নেস্টেড ফর্মটি তৈরি করুন / new.html.erb ...

<% form_for(@topic) do |topic_form| %>
  ...fields...
  <% topic_form.fields_for :articles do |article_form| %>
    ...fields...

... রেলগুলি স্বয়ংক্রিয়ভাবে লিঙ্কার তৈরি করে, যা দুর্দান্ত। এখন আমার প্রশ্নের জন্য: আমার লিঙ্কার মডেলটিতে এমন বৈশিষ্ট্যও রয়েছে যা আমি "নতুন বিষয়" ফর্মের মাধ্যমে পরিবর্তন করতে সক্ষম হতে চাই। তবে লিংকগুলি যে রেলগুলি স্বয়ংক্রিয়ভাবে তৈরি করে তাতে টপিক_আইডি এবং নিবন্ধ_আইড বাদে তার সমস্ত বৈশিষ্ট্যের জন্য শূন্য মান রয়েছে। আমি কীভাবে এই অন্যান্য লিঙ্কার বৈশিষ্ট্যের জন্য "নতুন বিষয়" ফর্মের জন্য ক্ষেত্রগুলি রাখতে পারি যাতে সেগুলি শূন্য হয় না?


3
আমি কেবল আপনি তৈরি / নতুন ক্রিয়াকলাপে একই জিনিসটি করার চেষ্টা করছি ... আমি ভাবছি আপনি নিজের নিয়ন্ত্রক ক্রিয়াকে ভাগ করে নিতে পারছেন কিনা I'm আমি একটি তৈরি করতে চান Userএকটি মাধ্যমে Accountএকটি ব্যবহার Relationshipহিসেবে linker... কিন্তু আমি চিন্তা করতে পারে না নতুন কি এবং তৈরি ক্রিয়া মত ... তুমি কিছু মনে করবে বর্ণন বোঝানো হয়?
মোহামাদ

উত্তর:


90

উত্তরটি বের করলেন। কৌশলটি ছিল:

@topic.linkers.build.build_article

এটি লঙ্কারগুলি তৈরি করে, তারপরে প্রতিটি লিঙ্কারের জন্য নিবন্ধটি তৈরি করে। সুতরাং, মডেলগুলিতে:
টপিক.আরবি এর accepts_nested_attributes_for :linkers
লিঙ্কার.আরবি দরকারaccepts_nested_attributes_for :article

তারপরে ফর্মটিতে:

<%= form_for(@topic) do |topic_form| %>
  ...fields...
  <%= topic_form.fields_for :linkers do |linker_form| %>
    ...linker fields...
    <%= linker_form.fields_for :article do |article_form| %>
      ...article fields...

13
এটি সহায়ক ছিল কিনা আমাকে জানান
আর্কিলে

13
Form_for এবং field_for প্রয়োজন <% =%> পরিবর্তে <%%> আপনার পাগল 3. ব্যবহার করছেন: 3 আপডেট পাগল
Arcolye

আপনার যুক্ত লাইনগুলির জন্য আমি দুটি গ্রহণযোগ্য_নেট_ট্রিবিউट्स_র চারপাশে কোড ব্যাকটিকগুলি যুক্ত করব। কেবল কোডটি স্ক্যান করার সময় আমি সেই তথ্যটি বারবার মিস করেছি - একবার আমি এটি পুরোপুরি পড়ার পরে, আমি সেই অনুপস্থিত বিবরণটি পেয়েছিলাম এবং এটি আমার সমস্যার সমাধান করে। ধন্যবাদ!
টিজে শুক

2
সত্যি কথা বলতে, এই ধরণের সম্পূর্ণ উদাহরণ যা রুবিওনরইলস.আরোগ গাইডের প্রয়োজন।
আহ্নবিজক্যাড

ভিজ্যুয়াল স্বচ্ছতা সত্যিই অনেক বেশি এগিয়ে যায়, টিজে শক।
আহ্নবিজক্যাড

6

রেলের দ্বারা উত্পন্ন ফর্মটি যখন কারাগুলিতে জমা দেওয়া হয় controller#action, তখন এর paramsঅনুরূপ একটি কাঠামো থাকবে (কিছু তৈরি বৈশিষ্ট্য যুক্ত করা হবে):

params = {
  "topic" => {
    "name"                => "Ruby on Rails' Nested Attributes",
    "linkers_attributes"  => {
      "0" => {
        "is_active"           => false,
        "article_attributes"  => {
          "title"       => "Deeply Nested Attributes",
          "description" => "How Ruby on Rails implements nested attributes."
        }
      }
    }
  }
}

খেয়াল করুন কীভাবে কীগুলির সাথে linkers_attributesশূন্য-সূচকযুক্ত , এবং একটি নয় ? ওয়েল, এটি কারণ সার্ভারে প্রেরিত ফর্ম ফিল্ড কীগুলি দেখতে এই জাতীয় দেখাচ্ছে:HashStringArray

topic[name]
topic[linkers_attributes][0][is_active]
topic[linkers_attributes][0][article_attributes][title]

রেকর্ড তৈরি করা এখন যেমন সহজ:

TopicController < ApplicationController
  def create
    @topic = Topic.create!(params[:topic])
  end
end

আমি নিশ্চিত নই, তবে আমি মনে করি এটি বরাবর ধরে নেওয়া হয়েছিলaccepts_nested_attributes_for
আর্কিলে

2
@ আরকোলিয়ে - ইন্টারনেটে এই জাতীয় সংস্থার জন্য এই তথ্য সন্ধান করা তখন এমন ব্যথা ছিল - সম্ভবত আমার গুগল-ফু সেদিন বন্ধ ছিল। আমি আমার সহকর্মী হিসাবে এখানে কমপক্ষে এটি নথিভুক্ত করতে চেয়েছিলাম এবং আমি সবেমাত্র শূন্য সূচকযুক্ত হ্যাশের পরিবর্তে রেলগুলিকে সংযুক্ত_অযুক্তিগুলিকে একটি অ্যারে রূপান্তরিত বলে ধরে নিয়েছি। আশাকরি এই
টিডিবিট

3

আপনার সমাধানে has_one ব্যবহার করার জন্য একটি দ্রুত গোটচা। আমি শুধু উত্তর ব্যবহারকারী কর্তৃক প্রদত্ত অনুলিপি করা এবং আটকানো হবে KandadaBoggu মধ্যে এই থ্রেড


buildপদ্ধতি স্বাক্ষরের জন্য আলাদা has_oneএবং has_manyসমিতির।

class User < ActiveRecord::Base
  has_one :profile
  has_many :messages
end

has_manyসংস্থার জন্য বিল্ড সিনট্যাক্স :

user.messages.build

has_oneসংস্থার জন্য বিল্ড সিনট্যাক্স :

user.build_profile  # this will work

user.profile.build  # this will throw error

আরও তথ্যের জন্য has_oneসমিতির ডকুমেন্টেশন পড়ুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.