إضافة إجراء إلى وحدة تحكم موجودة (Ruby on Rails)
-
03-07-2019 - |
سؤال
أنا جديد على Ruby on Rails، لقد أكملت مدونة تعليمية.
أحاول الآن إضافة إجراء إضافي إلى وحدة التحكم، يسمى "البدء".
def start
end
لقد أضفت صفحة عرض "app/views/posts/start.html.erb" لا تحتوي إلا على HTML بسيط.
عندما أذهب إلى /posts/start أحصل على الخطأ التالي.
ActiveRecord::RecordNotFound in PostsController#show
Couldn't find Post with ID=start
أتفهم الخطأ، ويتم تنفيذ إجراء العرض والبدء ليس معرفًا صالحًا.لماذا لا يتم تنفيذ إجراء البدء، هل هناك جزء من بنية MVC أو التكوين الذي أفتقده؟
يوجد أدناه موقع post_controller.rb الخاص بي
class PostsController < ApplicationController
# GET /posts/start
def start
end
# GET /posts
# GET /posts.xml
def index
@posts = Post.find(:all)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @posts }
end
end
# GET /posts/1
# GET /posts/1.xml
def show
@post = Post.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @post }
end
end
end
نعم لقد قمت بإعادة تشغيل الخادم وجربته مع Mongrel وwebrick.
المحلول
ولم يتم تعيين التوجيه لديك للسماح هذا الطريق. على افتراض أنك تستخدم السقالات الافتراضي، ووضع هذا الخط <م> قبل م> خط map.resources :posts
في التكوين / routes.rb:
map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i
والتعبير المعتاد ل:action
لانها تقيد مجرد زي (لتجنب التقاط الأشياء مثل / وظائف / 1). يمكن تحسينها إذا كنت بحاجة إلى سفلية أو الأرقام في الإجراءات الجديدة.
نصائح أخرى
والخطأ كنت صنع هو في الواقع واحد شائع جدا.
والأساس، والقضبان خرائط تلقائيا عناوين لالسقالات الخاصة بك. لذلك عند إنشاء المشاركات السقالات، القضبان ورسم خرائط الطرق URL لذلك. واحدة من هذه الطريق هو عنوان URL للعرض وظيفة واحدة: / وظائف / (POST_ID)
وهكذا، عندما كنت دخول URL / وظائف / بدء القضبان يفكر تقوله "يا تعطيني آخر مع ID = بدء. لذا القضبان يشكو من أن طريقة العرض لا يمكن العثور على وظيفة مع هذا ID .
واحد طريقة سريعة لإصلاح هذه هي التأكد من لديك التكوين / routes.rb له الطريق للعمل بداية قبل طرق السقالات:
# Route for start action
map.connect '/posts/start', :controller => 'posts', :action => 'start'
# Default mapping of routes for the scaffold
map.resources :posts
وعلى أي حال، ونأمل أن يساعد.
في القضبان استخدام 4.x من:
get '/posts/start', :controller => 'posts', :action => 'start'
في القضبان استخدام 3.X:
match '/posts/start', :controller => 'posts', :action => 'start'
وبدلا من
map.connect '/posts/start', :controller => 'posts', :action => 'start'
وأنها تحل قضية بلدي.
وجرب هذا إذا كنت تستخدم القضبان 3.0.3
وفي route.rb بك
resource :posts do
collection do
get 'start'
end
end
وهذا قد يساعد
أريد أن أقول، في بعض الأحيان يصبح ريلز ملتصقًا بالتخزين المؤقت للمسارات، حتى في تطوير بيئة.
قد يساعد على أعد تشغيل خادم Rails الخاص بك.لقد نجح هذا معي مرات أكثر مما يمكنني الاعتماد عليه عند تلقي هذا الخطأ.
وهذا يعمل:
map.resource :post, :collection => { :my_action => :get}
ولقد وجدت الحل لمشكلتي، في ملف routes.rb حيث
map.resource :post
وأضفت مع حجة جمع، لذلك بقيت هذه الطريقة:
map.resource :post, :collection => { :my_action => :get}