首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套路由没有匹配的路由,但Rake路由中存在路由

嵌套路由没有匹配的路由,但Rake路由中存在路由
EN

Stack Overflow用户
提问于 2014-07-18 14:39:33
回答 2查看 700关注 0票数 2

已更新

代码语言:javascript
复制
Started GET "/classifieds/12/questions/new" for 127.0.0.1 at 2014-07-18 10:55:27 -0400
Processing by QuestionsController#new as HTML
  Parameters: {"classified_id"=>"12"}
  Classified Load (0.5ms)  SELECT "classifieds".* FROM "classifieds" WHERE "classifieds"."id" = $1 LIMIT 1  [["id", "12"]]
  Rendered questions/new.html.erb within layouts/application (2.5ms)
Completed 500 Internal Server Error in 35ms

TypeError - can't convert Symbol into Integer:

我有一个belongs_to :classified的问题模型和一个has_many :questions的分类模型。

因此,我在routes.rb中执行嵌套路由

代码语言:javascript
复制
  resources :classifieds do 
    resources :questions
  end

正因为如此,当我做耙路的时候,我会得到这些新的路线。

代码语言:javascript
复制
 classified_questions GET    /classifieds/:classified_id/questions(.:format)                               questions#index
                                                        POST   /classifieds/:classified_id/questions(.:format)                               questions#create
                                new_classified_question GET    /classifieds/:classified_id/questions/new(.:format)                           questions#new
                               edit_classified_question GET    /classifieds/:classified_id/questions/:id/edit(.:format)                      questions#edit
                                    classified_question GET    /classifieds/:classified_id/questions/:id(.:format)                           questions#show
                                                        PUT    /classifieds/:classified_id/questions/:id(.:format)                           questions#update
                                                        DELETE /classifieds/:classified_id/questions/:id(.:format)                           questions#destroy

我正在浏览指南中的嵌套资源部分。新问题应该给我一个表单,我可以在那里张贴到questions#create,这允许我张贴问题到数据库,属于一个特定的分类广告。

在模式中的问题表中,我添加了这个挂钩。

代码语言:javascript
复制
t.integer  "classifieds_id"

*我没有分类控制器。

这是我的控制器,它正在呈现显示方法。

代码语言:javascript
复制
class UplatzPlacesController < ApplicationController
  require 'balanced'
    helper_method :countries
  def show
    @classified=Classified.find(params[:id])
  end
end

show.html.erb向用户显示分类广告,在底部有一个link_to

代码语言:javascript
复制
 <%= link_to "Post a question", new_classified_question_path(@classified.id) %>

我生成了自己的问题控制器

代码语言:javascript
复制
class QuestionsController < ApplicationController

  def index
  end

  def new
    @classified = Classified.find(params[:classified_id])
    @question = Question.new 
  end 

  def create
    @classified = Classified.find(params[:classified_id])
    @question = Question.new(params[:question])
    @classified.questions << @question
    if @question.save 
      flash[:notice] = "Question has been posted"
    else
      flash[:notice] = "It did not go through"
    end
  end
end

当我单击link_to时,我确实看到了表单,并且url变成如下

代码语言:javascript
复制
classifieds/12/questions/new #shows that id got passed correctly

但是,当我单击submit时,我将得到这个路由错误。

代码语言:javascript
复制
Routing Error

No route matches [POST] "/classifieds/12/questions/new"

*每条路线都有邮政。

这是我的观点/问题中的new.html.erb

代码语言:javascript
复制
<%=form_for @question, :url => new_classified_question_path do |f| %>
      <fieldset>
        <ul id='posting_question_form'>
          <li>
            <%=f.label :question_body, 'Post Your Question To Seller:'%>
            <%= f.text_area :question_body, :cols=>40, :rows=>50 %>
          </li>
        </ul>
      </fieldset>
      <div>
      <%= f.submit "Post Question", :class => 'goButton', :style => 'width:auto;float:right;' %>
      </div>
  <% end %>
</div>

我在问题模型中设置了大量赋值的属性。

代码语言:javascript
复制
attr_accessible :question_body, :classifieds_id

它应该能用,但它不管用。

另外,应用程序是gem 'rails', '3.2.13'

EN

回答 2

Stack Overflow用户

发布于 2014-07-18 14:47:17

您正在使用错误的URL帮助程序:

代码语言:javascript
复制
new_classified_question_path

此助手将导致嵌套在new中的控制器questionsclassified操作。( Rails中的URL的结构如下:<action>_<parent_controller>_<controller_name>_path或以_url而不是_path结尾)。

你应该使用:

代码语言:javascript
复制
form_for @question, classified_questions_path(@classified) do |f|

给你的指南:helpers.html

票数 1
EN

Stack Overflow用户

发布于 2014-07-18 15:29:00

在你的新控制器上,应该提出一个新的问题

代码语言:javascript
复制
# GET /classifieds/:classified_id/questions/new
def new
  # 1st you retrieve the classified to params[:classified_id]
  @classified = Classified.find(params[:classified_id])     
  # 2nd you build a new one of question
  @question = @classified.questions.build
end

# POST /classifieds/:classified_id/questions
def create
  # 1st you retrieve the classified to params[:classified_id]
  @classified = Classified.find(params[:classified_id])
  #2nd you create the question with arguments in params[:question]
  @question = @classified.questions.create(params[:question])
  respond_to do |format|
   if @question.save 
     # redirection to the Question resource
     format.html { redirect_to([@question.classified, @question], :notice => 'Question has been posted.')
     # or redirection to the list of Questions
     # redirect_to(classified_@questions_url)
   else
     format.html { 
       flash[:error] = "It did not go through"
       render :action => "new" 
     } 
   end
  end
end

以及新的形式

代码语言:javascript
复制
<%= form_for([@question.classified, @question]) do |f| %>
   ....
<% end %>

另一种创建嵌套资源的方法:在rails 3中创建嵌套资源,并更新脚手架链接和重定向

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24827655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档