导轨5-显示路线不起作用或无法产生

时间:2018-07-09 20:49:28

标签: ruby-on-rails

我正在研究Rails 5.2.0。我正在开发一个简单的简单应用程序,以使自己对任何新事物都沾沾自喜(主要在带有Rails 3和4应用程序的生产环境中工作)。

我在索引路径上,呈现类似

<ul>
    <% @questions.each do |question| %>
        <li><%= link_to question.title, questions_path(question.id) %></li>
    <% end %>
</ul>

我的控制器看起来像

def index
    @questions = Question.all
end

def new
    @question = Question.new
end

def create
    @question = Question.new(title: params['question']['title'], body: params['question']['body'])

    if @question.save 
        redirect_to '/'
    else
        redirect_to '/questions/new'
    end
end

def show
    @question = Question.find(params[:id])
end

我的路线看起来像

get '/' => 'questions#index'

get '/questions/new' => 'questions#new'

post '/questions' => 'questions#create'

get '/questions/:id' => 'questions#show'

这很好,但是当我单击索引中的链接时,得到的路径为http://localhost:3000/questions.8,而当我运行rails routes时,得到

Prefix Verb URI Pattern                                                                              Controller#Action
                          GET  /                                                                                        questions#index
                          GET  /questions/:id(.:format)                                                                 questions#show
            questions_new GET  /questions/new(.:format)                                                                 questions#new
                questions POST /questions(.:format)                                                                     questions#create

,如果您注意到它没有为表演路线生成路径。唯一有效的方法就是在索引中执行类似的操作

<% @questions.each do |question| %>
    <li><%= link_to question.title, "/questions/#{question.id}" %></li>
<% end %>

这很好,但是却破坏了这些路线的全部目的。

有人看到我在做什么错或遗忘吗?这是5件事,还是我的代码中有些愚蠢?

2 个答案:

答案 0 :(得分:1)

您的问题是questions_path路由到/questions,所以当您这样做时,

link_to question.title, questions_path(question.id)

您将获得/questions,并在{{1}之后附加question.id(因为.8不需要参数)。

相反,您不应该这样做:

questions_path

哪个会给你:

root 'questions#index'
resources :questions

(如果愿意,您可以使用 root GET / questions#index questions GET /questions(.:format) questions#index POST /questions(.:format) questions#create new_question GET /questions/new(.:format) questions#new edit_question GET /questions/:id/edit(.:format) questions#edit question GET /questions/:id(.:format) questions#show PATCH /questions/:id(.:format) questions#update PUT /questions/:id(.:format) questions#update DELETE /questions/:id(.:format) questions#destroy :only修剪路线。)

然后您可以做:

:except

铁路应该从<ul> <% @questions.each do |question| %> <li><%= link_to question.title, question %></li> <% end %> </ul> 变量中推断出正确的路线,并按照docs所述创建到question的链接。

答案 1 :(得分:0)

您应将表演路线定义为

get '/questions/:id' => 'questions#show', :as => :question 

然后将其用作question_path(question)(注意不要复数),因为到questions_path的路由已经使用了questions#index

但是,如果您想使用更清洁的解决方案,最好使用Rails的路线帮助器方法resources

resources :questions, :only => [:index, :new, :create, :show]