Rails:form_tag自定义操作出错

时间:2014-09-04 13:36:31

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-3.2

大约一年半以前,我使用版本3.2参加了Ruby on Rails的在线课程。我完成了课程并完成了应用程序,现在我将回到课程PDF并在Rails 4.1.0中进行操作。

我得到了一个我收到错误的部分,我不确定我是做错了什么,或者是否从Rails 3.2改为4.1。

我有这个form_tag标签:

<%= form_tag :action => 'review', :id => @restaurant do %>
  <strong>Poster: </strong><%= text_field "review", "poster" %><br /><br />
  <strong>Date: </strong><%= datetime_select "review", "date" %><br /><br />
  <strong>Review:</strong><br />
  <%= text_area "review", "review", :rows => 5 %><br />
  <%= submit_tag "Review" %>
<% end %>

指示说要使其工作以将以下代码放在restaurants_controller.rb文件中:

def review
  Restaurant.find(params[:id]).reviews.create(params[:review])
  redirect_to :action=>"show", :id => params[:id]
end

但是当我尝试查看具有for for for的页面时,我收到此错误:

No route matches {:action=>"review", "controller=>"restaurants", :id=>#<Restaurant id: 1, name: "Marco & Luca", created_at: "...", updated_at: "..."

我的佣金路线显示,节目被映射到餐馆#show被映射到餐馆路径。

form_tag文件是错误的吗?

在类的说明中我们没有在routes.rb中设置任何东西,我猜这是因为控制器文件中的redirect_to行。现在这个被弃用了吗?这不再有效吗?

按要求路由文件:(在课堂练习中我们不必编辑路线文件)。

Rails.application.routes.draw do

# You can have the root of your site routed with "root"
root 'restaurants#index'

resources :restaurants do
  collection do
    get 'login'
    get 'register'
    post 'newuser'
    post 'validate'
    post 'search'
  end
end

谢谢!

2 个答案:

答案 0 :(得分:1)

你确实需要一条路线。它的工作方式是:

  • 用户在某个页面上填写表单并将数据发送到review路径
  • 服务器处理用户的数据并返回重定向到show路径
  • 用户获取重定向并请求show路径
  • 服务器执行show操作

显然review行动的路线(或我上面称之为:review路线)并不存在于routes.rb中。添加它。

UPD:您的路线文件看起来很奇怪,您似乎没有按照惯例在一个控制器中处理一种类型的资源。在这里,您可能需要添加:

    ...
    post 'search'
    post 'review'
    # ^ THIS ^
  end
end

但您已经在一个控制器中处理了至少3种类型的资源:User s,SessionRestaurant s。如果您被告知这可能不是您的错,但在任何一种情况下,它都不是构建应用程序的正确方法。

答案 1 :(得分:0)

尝试:

<%= form_tag :action => 'review', :id => @restaurant.id do %>