Ruby on rails Rails没有路由错误,而rake路由提供路由

Ruby on rails Rails没有路由错误,而rake路由提供路由,ruby-on-rails,resources,routes,nested,Ruby On Rails,Resources,Routes,Nested,我正在处理Rails中的嵌套资源场,创建新资源场的表单如下所示: <%= form_for([@user, @farm], :url=> new_user_farm_path(@user)) do |f| %> <% if @farm.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@farm.errors.count, "error") %>

我正在处理Rails中的嵌套资源场,创建新资源场的表单如下所示:

 <%= form_for([@user, @farm], :url=> new_user_farm_path(@user)) do |f| %>
 <% if @farm.errors.any? %>
 <div id="error_explanation">
  <h2><%= pluralize(@farm.errors.count, "error") %> prohibited this farm from being saved:</h2>

  <ul>
  <% @farm.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
  </div>
  <% end %>

  <div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
  </div>
  <div class="field">
  <%= f.label :contact %><br />
  <%= f.text_field :contact %>
  </div>
  <div class="field">
  <%= f.label :adress %><br />
  <%= f.text_field :adress %>
  </div>
  <div class="actions">
  <%= f.submit %>
  </div>
  <% end %>
它可以很好地呈现表单,但在我单击“提交”之后,它实际上尝试创建新场,我收到以下错误:

 No route matches [POST] "/users/2/farm/new"
在我的rake路线中,我清楚地看到该路线显示:

     user_farm POST   /users/:user_id/farm(.:format) {:action=
    create", :controller=>"farms"}
我只是猜测问题出在我的create函数中:

 def create
@farm = Farm.new(params[:farm])
@user = User.find(current_user)


respond_to do |format|
  if @farm.save
    format.html { redirect_to user_farm(@user, @farm), notice: 'Farm was successfully created.' }
    format.json { render json: @farm, status: :created, location: @farm }
  else
    format.html { render action: "new" }
    format.json { render json: @farm.errors, status: :unprocessable_entity }
  end
end
end    
My routes.rb文件:

  resources :users do
  resource :farm
  end


  devise_for :users, :path => 'accounts'
我正在通过以下链接访问我的新农场表格:

 <%= link_to "New Farm", new_user_farm_path(current_user) %>
一些问题:

-

Params

在Rails中创建新的ActiveRecord对象时,需要使用强参数:

这将使您能够从控制器或视图到达该路线。 如果你给我一些更多的信息路线文件,我将能够帮助进一步

-

职位

再看一遍这个问题,好像我以前疏忽了

正如pdbobb所指出的,这个错误肯定是说你试图用一个后置动词来达到/新的目的。这是不正确的,因为根据Rails资源丰富的路由约定,您需要

您可以使用pdobb的答案,但更重要的是,我们需要确定您的表单试图提交到新帖子的原因

该问题可能与嵌套资源有关

某些问题:

-

Params

在Rails中创建新的ActiveRecord对象时,需要使用强参数:

这将使您能够从控制器或视图到达该路线。 如果你给我一些更多的信息路线文件,我将能够帮助进一步

-

职位

再看一遍这个问题,好像我以前疏忽了

正如pdbobb所指出的,这个错误肯定是说你试图用一个后置动词来达到/新的目的。这是不正确的,因为根据Rails资源丰富的路由约定,您需要

您可以使用pdobb的答案,但更重要的是,我们需要确定您的表单试图提交到新帖子的原因


问题可能与嵌套资源有关

问题在于表单试图对仅用于GET请求的url发出POST请求。所以它告诉你

[POST] "/users/2/farm/new"
不存在-它不存在。你的rake routes输出证实了这一点——最成功的事情是

new_user_farm GET    /users/:user_id/farm/new(.:format)
这是一个GET请求

表单默认使用POST创建新记录,因此您需要提供一个可以发布到的url。或者,您可以让Rails从对象的状态中找出它。所以

<%= form_for([@user, @farm], :url=> user_farm_path(@user)) do |f| %>


应该有用。在前一种情况下,我们使用与rake routes输出中的POST路由匹配的命名路由。在后一种情况下,我们让rails根据@farm对象的状态来计算。也就是说,如果@farm是一个新的记录?它将向/users/:user_id/farm提交POST请求,或者如果@farm被持久化?然后它将向/users/:user\u id/farm提交一个PUT请求。相同的路径,只是不同的请求类型。

问题在于,您的表单试图向仅存在GET请求的url发出POST请求。所以它告诉你

[POST] "/users/2/farm/new"
不存在-它不存在。你的rake routes输出证实了这一点——最成功的事情是

new_user_farm GET    /users/:user_id/farm/new(.:format)
这是一个GET请求

表单默认使用POST创建新记录,因此您需要提供一个可以发布到的url。或者,您可以让Rails从对象的状态中找出它。所以

<%= form_for([@user, @farm], :url=> user_farm_path(@user)) do |f| %>


应该有用。在前一种情况下,我们使用与rake routes输出中的POST路由匹配的命名路由。在后一种情况下,我们让rails根据@farm对象的状态来计算。也就是说,如果@farm是一个新的记录?它将向/users/:user_id/farm提交POST请求,或者如果@farm被持久化?然后它将向/users/:user\u id/farm提交一个PUT请求。相同的路径,只是不同的请求类型。

我添加了更多信息,如果您还需要其他信息,请告诉我。准确地说,表单呈现没有问题。我填写这三个字段,点击CreateFarm,它会给我那个错误。嗯,它引用了一个特定的行还是什么?没有,它只说:路由错误,然后它会给那个错误。这就是它如此令人困惑的原因之一。我真的不知道还能尝试什么。顺便说一句,我已经添加了你对强参数的建议,谢谢你。我真的希望我们能够解决这个问题。我使用了@pdobb的答案,但现在它不会显示农场,正如你在我对他的答案的评论中所看到的。我已经添加了一些更多的信息,如果你还需要什么,请告诉我。确切地说,表单呈现没有问题。我填写这三个字段,点击CreateFarm,它会给我那个错误。嗯,它引用了一个特定的行还是什么?没有,它只说:路由错误,然后它会给那个错误。这就是它如此令人困惑的原因之一。我真的不知道还能尝试什么。顺便说一句,我已经添加了你对强参数的建议,谢谢你。我真的希望我们能在一起
我用了@pdobb的答案,但现在它不会显示农场,你可以在我对他的答案的评论中看到。是的,这是个问题。对不起,还有一个问题,因为我是初学者。为什么它不会向我展示我刚刚创建的农场。上面写着:找不到没有ID的农场。我强烈怀疑我的create函数有点不好。你能检查一下,确保一切正常吗?@farm=farm.newparams[:farm]看起来不错。。。你能在你的创建操作中加入一个调试器并检查结果吗?我不知道为什么当你想要建立一个农场的时候,它会问你如何找到一个农场。你是不是做错了?另外,如果您已经有了当前的\u用户,那么您根本不需要执行@user=user.findcurrent\u用户位-只需使用当前的\u用户即可。我在我的创建场中更改了这一点,但仍然会遇到相同的错误。它将我重定向到此链接:。我猜我的create函数中的重定向也不好。哦,好的。所以请注意我在上面评论中的编辑。。。我一时糊涂。所以,是的,在创建操作中重定向到的应该是user\u farm_path@user,@farm不仅仅是用户_farm@user,@farm。此外,正如@Rich Peck所说,看起来您需要资源:路由文件中的农场,而不仅仅是资源:农场。是的,这是一个问题。对不起,还有一个问题,因为我是初学者。为什么它不会向我展示我刚刚创建的农场。上面写着:找不到没有ID的农场。我强烈怀疑我的create函数有点不好。你能检查一下,确保一切正常吗?@farm=farm.newparams[:farm]看起来不错。。。你能在你的创建操作中加入一个调试器并检查结果吗?我不知道为什么当你想要建立一个农场的时候,它会问你如何找到一个农场。你是不是做错了?另外,如果您已经有了当前的\u用户,那么您根本不需要执行@user=user.findcurrent\u用户位-只需使用当前的\u用户即可。我在我的创建场中更改了这一点,但仍然会遇到相同的错误。它将我重定向到此链接:。我猜我的create函数中的重定向也不好。哦,好的。所以请注意我在上面评论中的编辑。。。我一时糊涂。所以,是的,在创建操作中重定向到的应该是user\u farm_path@user,@farm不仅仅是用户_farm@user,@farm.此外,正如@Rich Peck所说,看起来您需要的是资源:路由文件中的农场,而不仅仅是资源:农场。
<%= form_for([@user, @farm], :url=> user_farm_path(@user)) do |f| %>
<%= form_for([@user, @farm]) do |f| %>