form_for নেস্টেড সংস্থান সহ with


125

আমার কাছে form_for এবং নেস্টেড সংস্থানগুলি সম্পর্কে একটি দ্বি-অংশ প্রশ্ন রয়েছে। ধরা যাক আমি একটি ব্লগ ইঞ্জিন লিখছি এবং আমি একটি নিবন্ধে একটি মন্তব্য সম্পর্কিত করতে চাই। আমি নীচে একটি নেস্টেড রিসোর্স সংজ্ঞায়িত করেছি:

map.resources :articles do |articles|
    articles.resources :comments
end

মন্তব্য ফর্মটি নিবন্ধের জন্য নিবন্ধের জন্য শো। Html.erb দেখুনটিতে রয়েছে, উদাহরণস্বরূপ:

<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
    <%= f.text_area :text %>
    <%= submit_tag "Submit" %>
<%  end %>

এটি একটি ত্রুটি দেয়, "শূন্যতার জন্য আইডি বলা হয়, যা ভুলক্রমে হবে etc." আমি চেষ্টাও করেছি

<% form_for @article, @comment do |f| %>

যা সঠিকভাবে রেন্ডার করে তবে মন্তব্যটির পরিবর্তে নিবন্ধের 'পাঠ্য' ক্ষেত্রের সাথে f.text_area সম্পর্কিত এবং সেই পাঠ্য অঞ্চলে নিবন্ধের জন্য এইচটিএমএল উপস্থাপন করে te সুতরাং আমিও এই ভুল আছে বলে মনে হচ্ছে। আমি যা চাই তা এমন একটি ফর্ম যার 'সাবমিট' হ'ল কমেন্টস কনট্রোলারের উপর ক্রিয়াকলাপটি কল করবে, প্যারামগুলিতে একটি নিবন্ধ_আইড দিয়ে, উদাহরণস্বরূপ / নিবন্ধ / 1 / মন্তব্যে পোস্টের অনুরোধ।

আমার প্রশ্নের দ্বিতীয় অংশটি হ'ল, মন্তব্য সূচনাটি তৈরি করার সর্বোত্তম উপায়টি কী? আমি আর্টিকেলস কনট্রোলারের শো অ্যাকশনে একটি @ কমেন্ট তৈরি করছি, সুতরাং ফর্ম_ফোনের সহায়তার জন্য একটি মন্তব্যে অবকাশ থাকবে। তারপরে মন্তব্যসন্ট্রোলারের তৈরি ক্রিয়াকলাপে আমি ফর্ম_ফোর্স থেকে পাস করা প্যারামগুলি ব্যবহার করে নতুন @ মন্তব্য তৈরি করব।

ধন্যবাদ!

উত্তর:


228

ট্র্যাভিস আর সঠিক। (আমি ইচ্ছুক যে আমি আপ উত্সাহ দিতে পারে।) আমি এই কাজ নিজেই পেয়েছি। এই রুটগুলি সহ:

resources :articles do
  resources :comments
end

আপনি পাথ পান:

/articles/42
/articles/42/comments/99

কন্ট্রোলার এ রুট

app/controllers/articles_controller.rb
app/controllers/comments_controller.rb

ঠিক যেমন কোনও বিশেষ নেমস্পেস নেই সেটিকে http://guides.rubyonrails.org/routing.html#nested-res উত্স অনুসারে বলা হয়েছে।

কিন্তু পার্টিয়াল এবং ফর্ম জটিল হয়ে ওঠে। বর্গাকার বন্ধনী নোট করুন:

<%= form_for [@article, @comment] do |f| %>

সর্বাধিক গুরুত্বপূর্ণ, আপনি যদি ইউআরআই চান, আপনার এই জাতীয় কিছু প্রয়োজন হতে পারে:

article_comment_path(@article, @comment)

বিকল্পভাবে:

[@article, @comment]

http://edgeguides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects এ বর্ণিত

উদাহরণস্বরূপ, comment_itemপুনরাবৃত্তির জন্য সরবরাহিত সংকলনের আংশিক ভিতরে ,

<%= link_to "delete", article_comment_path(@article, comment_item),
      :method => :delete, :confirm => "Really?" %>

জামুরাআ যা বলে তা নিবন্ধের প্রসঙ্গে কাজ করতে পারে, তবে এটি আমার পক্ষে অন্যান্য বিভিন্ন উপায়ে কার্যকর হয়নি।

নেস্টেড রিসোর্স সম্পর্কিত অনেক আলোচনা রয়েছে, যেমন: http://weblog.jamisbuck.org/2007/2/5/nesting-resources

মজার বিষয় হল, আমি কেবল শিখেছি যে বেশিরভাগ লোকের ইউনিট-পরীক্ষাগুলি আসলে সমস্ত পাথ পরীক্ষা করে না। লোকেরা যখন জামিসবকের পরামর্শ অনুসরণ করে, তখন তারা নেস্টেড রিসোর্সগুলি পাওয়ার দুটি উপায় নিয়ে শেষ হয়। তাদের ইউনিট-পরীক্ষাগুলি সাধারণভাবে / সহজতম পোস্টে পাবেন:

# POST /comments
post :create, :comment => {:article_id=>42, ...}

তারা যে রুটটিকে পছন্দ করতে পারে তা পরীক্ষা করার জন্য তাদের এটি এইভাবে করা দরকার:

# POST /articles/42/comments
post :create, :article_id => 42, :comment => {...}

আমি এটি শিখেছি কারণ আমার ইউনিট-পরীক্ষাগুলি ব্যর্থ হতে শুরু করে যখন আমি এ থেকে স্যুইচ করি:

resources :comments
resources :articles do
  resources :comments
end

এটি:

resources :comments, :only => [:destroy, :show, :edit, :update]
resources :articles do
  resources :comments, :only => [:create, :index, :new]
end

আমি অনুমান করি যে সদৃশ রুটগুলি রাখা এবং কয়েকটি ইউনিট-পরীক্ষা মিস করা ভাল। (কেন পরীক্ষা? কারণ এমনকি ব্যবহারকারী কখনই সদৃশগুলি দেখতে না পান, আপনার ফর্মগুলি সেগুলি প্রত্যক্ষভাবে বা নামযুক্ত রাস্তাগুলির মাধ্যমে উল্লেখ করতে পারে)) তবুও অযথা নকলকে হ্রাস করতে, আমি এটি সুপারিশ করছি:

resources :comments
resources :articles do
  resources :comments, :only => [:create, :index, :new]
end

দীর্ঘ উত্তরের জন্য দুঃখিত। আমি মনে করি অনেকে সূক্ষ্মতা সম্পর্কে সচেতন নয়।


এটি কাজ তবে জামুরার কন্ট্রোলারে আমাকে পরিবর্তন করতে হয়েছিল বলেছিলেন।
মার্কাস বেকার

জামের উপায় কাজ করে তবে আপনি সম্ভবত অতিরিক্ত জানেন না এমন অতিরিক্ত রুটগুলি দিয়ে শেষ করতে পারেন। স্পষ্ট করে বলা ভাল।
cdunn2001

আমি @ কোর্সে অভ্যন্তরীণ সংস্থানগুলি রেখেছি @ যদিও, [@result, @course]কাজ করেছে, কিন্তু form_for(@result, url: { action: "create" }) কাজ করে। এটির জন্য কেবলমাত্র শেষ মডেলের নাম এবং পদ্ধতির নাম প্রয়োজন।
আনোয়ার

@ সিডুএন ২০০1 দয়া করে আপনি এখানে ব্যাখ্যা করতে পারেন কেন আমাদের এখানে "@artical" উল্লেখ করা হয়েছে এবং এর অর্থ কী? নীচের বাক্য গঠন কী করে? : <% = ফর্ম_এর জন্য [@ বিভাগ, @ মন্তব্য] করুন | চ | %>
অর্পিত আগরওয়াল

1
ট্র্যাভিস / @ সিডিউন ২০০1 এটি সঠিকভাবে পেয়েছে। যখন আপনি সদৃশ ছাড়াই নেস্টেড রুটগুলি ব্যবহার করছেন তখন পিতামাতা এবং সংস্থান উভয়কেই সেট করবেন না, অন্যথায় এটি সমস্ত ক্রিয়াগুলি নেস্টেড বলে মনে করবে। তেমনি আপনি যদি সমস্ত কিছু নেস্ট করে থাকেন তবে সর্বদা এটি.প্যারেন্ট সেট করুন। এছাড়াও আপনার যদি আংশিক নেস্টেড রুটগুলির সাথে বাতিল বোতামের সাথে একটি সাধারণ ফর্ম থাকে তবে নীচের মতো একটি পাথ ব্যবহার করুন যাতে আপনি যেটি সেট করেছেন তা কাজ করে (সন্তানের বহুবচনকরণ দ্রষ্টব্য): <% = লিঙ্ক_তে 'বাতিল', পিতামাতো_সৌনিক_পথ (এটি.প্যারেন্ট || এটি.চাইল্ড.পিতা)%>
ইহেগি

54

কন্ট্রোলারে উভয় বস্তু তৈরি হয়েছে তা নিশ্চিত করুন: @postএবং @commentপোস্টের জন্য যেমন:

@post = Post.find params[:post_id]
@comment = Comment.new(:post=>@post)

তারপরে দেখুন:

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

Form_for এ অ্যারের স্পষ্টরূপে সংজ্ঞায়িত করতে ভুলবেন না, কেবল উপরে আপনি যেমন কমা আলাদা করেছেন তা নয়।


ট্র্যাভিস হ'ল একটি পুরানো উত্তর, তবে আমি বিশ্বাস করি এটি রেলস 3.2.X এর জন্য সবচেয়ে সঠিক correct আপনি যদি ফর্ম বিল্ডারের সমস্ত উপাদান মন্তব্য ক্ষেত্রগুলি পপুলেশন করতে চান তবে কেবল একটি অ্যারে ব্যবহার করুন, ইউআরএল হেল্পারের প্রয়োজন নেই।
কার্ল

1
ক্রিয়াকলাপ নেস্ট করা আছে যেখানে কেবল প্যারেন্ট অবজেক্ট সেট করুন। আপনি যদি কেবলমাত্র আংশিকভাবে সম্পদটি নেস্টেট করে থাকেন (উদাহরণস্বরূপ যেমন), তবে প্যারেন্ট অবজেক্টটি সেট করা ফর্ম_ফেলার কারণ হয়ে উঠবে (এখনই 5.1 রেল দিয়ে পুনরায় নিশ্চিত করা হয়েছে)
ইহেগগি

35

ফর্মটিতে আপনাকে বিশেষ কিছু করার দরকার নেই। আপনি কেবল শো ক্রিয়ায় মন্তব্যটি সঠিকভাবে তৈরি করেছেন:

class ArticlesController < ActionController::Base
  ....
  def show
    @article = Article.find(params[:id])
    @new_comment = @article.comments.build
  end
  ....
end

এবং তারপরে নিবন্ধ দর্শনে এটির জন্য একটি ফর্ম তৈরি করুন:

<% form_for @new_comment do |f| %>
   <%= f.text_area :text %>
   <%= f.submit "Post Comment" %>
<% end %>

ডিফল্টরূপে, এই মন্তব্যটি যেতে হবে createকর্ম CommentsController, যেটি আপনি পরে সম্ভবত লাগাতে চান হবে redirect :backযাতে আপনি নাস্তানাবুদ পিছনে Articleপাতা।


10
আমাকে form_for([@article, @new_comment])ফরম্যাটটি ব্যবহার করতে হয়েছিল । আমি মনে করি এটি এর কারণ হিসাবে আমি প্রদর্শন করছি comments#new, না article#new_comment। আমি article#new_commentরেলগুলিতে মন্তব্য করেছি যে মন্তব্য বস্তুটি নেস্টেড রয়েছে তা কার্যকর করার জন্য যথেষ্ট স্মার্ট এবং আপনার এটি নির্দিষ্ট করতে হবে না?
স্যুপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.