มีปัญหาในการแสดงบทความเกี่ยวกับ Ruby on Rails หรือไม่

ฉันสร้างแบบฟอร์มเพื่อสร้างบทความ แต่สามารถดูได้เฉพาะบทความที่เผยแพร่ในหน้าดัชนีเท่านั้น และฉันไม่สามารถดูแต่ละบทความได้

ทุกครั้งที่ฉันคลิก 'แสดง' สำหรับแต่ละบทความในดัชนี จะมีการเปิดหน้าว่างที่มี URL เช่น localhost:3000/articles.1 แทนที่จะเป็น localhost:3000/articles/1

ฉันไม่รู้ว่ามีอะไรผิดปกติกับโค้ด มันคล้ายกับโค้ดที่ฉันมีสำหรับสร้างและแก้ไขบทความในฐานะผู้ดูแลระบบ และมันใช้งานได้ที่นั่น แต่ฉันได้รับข้อผิดพลาดนี้อยู่เรื่อยๆ

นี่คือรหัส:

มุมมอง/บทความ/show.html.erb:

<h1><%= @article.name %></h1>   
<%= @article.content %>
<%= image_tag @article.photo.url(:small) %>

<p>Tags: <%= raw article.tag_list.map { |t| link_to t, tag_path(t) }.join(', ') %></p>
<%= link_to 'Back', noticias_path %>

มุมมอง/บทความ/index.html.erb:

<% @articles.each do |article| %>
  <div>
  <h2><%= article.name %></h2>
  <%= article.content %>
  <p><%= link_to 'Show', noticias_path(article) %></p>
  <p>Tags: <%= raw article.tag_list.map { |t| link_to t, tag_path(t) }.join(', ') %></p>
  </div>
<% end %>

Articles_Controller.rb:

# GET /articles/1
# GET /articles/1.json
def show
  @article = Article.find(params[:id])
end

เส้นทาง.rb:

Blog::Application.routes.draw do 
  root to: 'welcome#index'
  get 'tags/:tag', to: 'noticias#index', as: :tag 
  get "noticias/index"
  get "dashboard/index" 
  get "/sitemap" => "sitemap#index", :as => :sitemap, :defaults => {:format => :xml} 
  match '/noticias', to: 'noticias#index', via: 'get' 
  get 'login', to: 'sessions#new', as: 'login' 
  get 'logout', to: 'sessions#destroy', as: 'logout' 
  resources :users 
  resources :sessions 
  namespace :admin do
    get '', to: 'dashboard#index', as: '/' 
    resources :noticias 
  end 
end

person LuisLago    schedule 11.12.2013    source แหล่งที่มา
comment
แสดง routes.rb ของคุณ   -  person Зелёный    schedule 11.12.2013
comment
@LuisLago ฉันโพสต์เส้นทางของคุณrbในคำถามสำหรับคุณ คุณสามารถแก้ไขคำถามได้ในครั้งถัดไปแทนที่จะวางลงในความคิดเห็น มันยากมากที่จะอ่านเป็นอย่างอื่น   -  person Paul Richter    schedule 11.12.2013
comment
ขอบคุณ ฉันจะจำไว้ครั้งหน้า   -  person LuisLago    schedule 11.12.2013


คำตอบ (2)


มันจะเป็นปัญหามากกว่ากับ noticias_path ลองตรวจสอบเส้นทางของคุณด้วย rake routes แต่ฉันคิดว่าการเปลี่ยน noticias_path เป็น noticia_path อาจสามารถแก้ไขได้

person Matheus Caceres    schedule 11.12.2013
comment
ไม่ มันไม่สามารถแก้ไขได้ ในเส้นทางฉันมีสิ่งนี้ match '/noticias', to: 'articles#index', via: 'get' ฉันสร้างแบบฟอร์มเป็นภาษาอังกฤษเพราะฉันทำตามบทช่วยสอนเป็นภาษาอังกฤษ แต่จากนั้นฉันก็สร้างเส้นทางไปยัง Notícias เพราะไซต์นั้นจะเป็นภาษาโปรตุเกส ฉันควรเปลี่ยนบทความเป็น noticias ในโค้ดทั้งหมดเพื่อหลีกเลี่ยงปัญหานี้หรือไม่ - person LuisLago; 11.12.2013
comment
@LuisLago เพื่อความกระจ่าง คุณหมายความว่าคุณ เท่านั้น มีเส้นทางดัชนีนั้น และไม่มีอะไรอื่นอีก (หมายความว่าคุณไม่มีบรรทัดที่ชี้ไปยังการกระทำ show) ดูเหมือนว่าจะเป็นปัญหาเกี่ยวกับเส้นทาง แต่คุณจะต้องโพสต์เส้นทางทั้งหมดของคุณเพื่อให้เราดู หากคุณเปลี่ยนชื่อเส้นทางบางเส้นทางเป็นภาษาโปรตุเกส ดูเหมือนว่าคุณอาจพลาดบางสิ่งบางอย่างไป - person Paul Richter; 11.12.2013
comment
@LuisLago คุณสามารถโพสต์เนื้อหาของเส้นทาง.rbเพื่อชี้แจงได้หรือไม่? - person Tom L; 11.12.2013
comment
ขออภัย แต่ไม่มีบรรทัดที่ชี้ไปที่การกระทำ show ใน Routes.rb - person LuisLago; 11.12.2013

จากไฟล์เส้นทางของคุณ ดูเหมือนว่าปัญหาคือการกำหนดเส้นทางที่ไม่ถูกต้องจริงๆ ในปัจจุบัน คุณกำลังสร้างเส้นทางสำหรับทรัพยากร RESTful ด้วยตนเอง เมื่อคุณควรปล่อยให้ Rails จัดการเรื่องนั้นให้คุณอย่างเหมาะสม

ลบบรรทัด get และ match ด้วยตนเอง:

get "noticias/index"

match '/noticias', to: 'noticias#index', via: 'get' 

และแทนที่ด้วยสิ่งนี้:

resources :noticias

หาก noticias ควรชี้ไปที่ ArticlesController (หรือตัวควบคุมอื่น ๆ) ให้ทำดังนี้:

resources :noticias, to: 'articles'

นอกจากนี้ Matheus Caceres ยังถูกต้องด้วยว่าตัวช่วย URL ที่จริงแล้วควรเป็น noticia_path สำหรับการดำเนินการ show noticias_path ชี้ไปที่การกระทำ index Rails พยายามที่จะ "ช่วยเหลือ" ด้วยการสร้างเส้นทาง ตัวช่วย ฟังก์ชัน ฯลฯ ให้ฟังดูเหมาะสมหากอ่านเป็นภาษาอังกฤษ แต่อาจไม่สมเหตุสมผลสำหรับคำในภาษาอื่น ฉันไม่รู้ว่า "noticia" มีความหมายในภาษาโปรตุเกสหรือไม่

หมายเหตุอีกประการหนึ่งคือ เส้นการกำหนดเส้นทางแบบแมนนวลสองเส้นที่ฉันระบุไว้ข้างต้นนั้นซ้ำซ้อน ที่จริงแล้วพวกเขาจะจับคู่คำขอ GET และกำหนดเส้นทางไปที่ noticias#index อย่างไรก็ตาม โปรดจำไว้ว่าเส้นทางจะถูกจับคู่ตามลำดับที่ปรากฏในไฟล์เส้นทาง ดังนั้นบรรทัด match จะไม่ถูกเรียก เนื่องจากเส้นทางจะตรงกันบนบรรทัด get นั้น

person Paul Richter    schedule 11.12.2013