سؤال

أنا جديد على 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}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top