为什么链接不起作用?未定义的局部变量路径或方法ROR

时间:2014-08-22 18:42:46

标签: ruby-on-rails ruby ruby-on-rails-3

我无法获得工作链接: 用户可以发布职位列表。其他用户可以查看职位列表并单击“申请”。 现在应该出现一个表单供用户填写一些信息。但是我无法正确获取路径和路径文件。 这是show.html.erb中正在运行的链接

<li><%= link_to "Apply Now", listing_apply_path(id: listings.id) %></li>

表单位于views / listings / apply.html.erb

目录/ show.html.erb

<div class="show_listing">

    <div class="col-md-6">
    <div class="col-md-6">
        <h3><%= @listing.title %></h3>
        <h3><%= @listing.location %></h3>
        <p><%= @listing.description %></p><br>
        <div class="center">
        <li><%= link_to "Apply Now", listing_apply_path(id: listings.id) %></li>
    </div>
    </div>
</div>
</div>

<div class="show_link_position">
<% if current_user == @listing.user %>
<%= link_to 'Edit', edit_listing_path, class: "btn btn-link" %> |
<% end %>
<%= link_to 'Back', current_user, class: "btn btn-link" %>
</div>

listings_controller.rb

    def apply
        @listing = Listing.find(params[:id])
      end

和路线

Rails.application.routes.draw do

  resources :categories

  get 'notifications/index'

  get 'notifications/create'

    resources :users
    resources :sessions, only: [:new, :create, :destroy]
    resources :listings



  root 'static_pages#home'


      match '/signup',  to: 'users#new',            via: 'get'
      match '/signin',   to: 'sessions#new',          via: 'get'
      match '/signout', to: 'sessions#destroy',     via:'delete'
      match '/help',      to: 'static_pages#help',    via: 'get'
      match '/contact',   to: 'static_pages#contact',  via: 'get'
      match '/about',     to: 'static_pages#about',   via: 'get' 
      match '/new',     to: 'listings#new',   via: 'get' 
      match '/users/:name/:id', to: 'listings#show', via: :get, as: :user_listing
      match '/findjobs',     to: 'listings#index',   via: 'get' 
      match '/users/:name/:id/edit', to: 'listings#edit', via: 'get'
      match '/:id/apply', to:  'listings#apply', via: 'get'

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

虽然Coderhs已经为你添加了一些东西,你还需要命名这条路线,这样就可以像这样找到匹配器:

 match '/:id/apply', to:  'listings#apply', via: 'get', as: :listing_apply

通过这种方式,您可以访问网址助手listing_apply_path

还需要matchvia,您只需指定

即可
get '/:id/apply', to: 'listings#apply', as: :listing_apply

match表示任何方法(例如POSTGETPUTDELETE

get表示处理GET个请求。

match:via的{​​{1}}与get相同,没有它。在我需要2个或更多VERBS到达同一个地方的情况下,我只使用via。否则我只需指定所需的方法。

来自http://guides.rubyonrails.org/routing

  

将GET和POST请求路由到单个操作具有安全隐患。通常,除非有充分的理由,否则应避免将所有动词都路由到动作。

更新

你问了

  

为什么我需要告诉路由我需要路径为:listing_apply。为什么我不能这样做让我们说编辑路径?

resources方法为您创建这些

resources :listings

为您生成以下路线

listings     GET    /listings              listings#index
             POST   /listings/create       listings#create
new_listing  GET    /listings/new          listings#new
edit_listing GET    /listings/:id/edit     listings#edit
listing      GET    /listings/:id          listings#show
             PUT    /listings/:id          listings#update
             DELETE /listings/:id          listings#destroy

这样可以访问listings_pathnew_listing_pathedit_listing_pathlisting_path。对于非命名路由,它使用VERB(POST,PUT,DELETE)来确定路由

答案 1 :(得分:1)

应该是

<li><%= link_to "Apply Now", listing_apply_path(id: @listing.id) %></li>

您需要将实例变量传入路径,在视图内部使用列表未定义。