没有路由匹配[POST]“/ store / index”

时间:2014-06-11 07:34:35

标签: html ruby-on-rails ruby

通过“使用rails 4.0进行敏捷Web开发”学习RoR,并且本地化选择器存在问题(第15.4节)。

在〜/ app / views / layouts / application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>Pragprog Books Online Store</title>
  <%= stylesheet_link_tag    "application", media: "all",
    "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body class="<%= controller.controller_name %>">
  <div id="banner">
    <%= form_tag store_index_path, class: 'locale' do %>
      <%= select_tag 'set_locale', 
        options_for_select(LANGUAGES, I18n.locale.to_s),
        onchange: 'this.form.submit()' %>
      <%= submit_tag 'submit' %>
      <%= javascript_tag "$('.locale input').hide()" %>
    <% end %>
    <%= image_tag("logo.png") %>
    <%= @page_title || t('.title') %>
  </div>
  <div id="columns">
    <div id="side">
      <% if @cart %>
        <%= hidden_div_if(@cart.line_items.empty?, id: 'cart') do %>
          <%= render @cart %>
        <% end %>
      <% end %>

      <ul>
        <li><a href="http://www...."><%= t('.home') %></a></li>
        <li><a href="http://www..../faq"><%= t('.questions') %></a></li>
        <li><a href="http://www..../news"><%= t('.news') %></a></li>
        <li><a href="http://www..../contact"><%= t('.contact') %></a></li>
      </ul>

      <% if session[:user_id] %>
        <ul>
          <li><%= link_to 'Orders', orders_path %></li>
          <li><%= link_to 'Products', products_path %></li>
          <li><%= link_to 'Users', users_path %></li>
        </ul>
        <%= button_to 'Logout', logout_path, method: :delete %>
      <% end %>

    </div>
    <div id="main">
      <%= yield %>
    </div>
  </div>
</body>
</html>

在〜/ app / controllers / store_controller.rb

class StoreController < ApplicationController
  skip_before_action :authorize
  include CurrentCart
  before_action :set_cart
  def index
    if params[:set_locale]
      redirect_to store_index_url(locale: params[:set_locale])
    else
      @products = Product.order(:title)
    end
  end
end

当我从选择器中选择区域设置时,我遇到路由错误:没有路由匹配[POST]“/ store / index”

请帮忙。

GitHub上的完整项目:https://github.com/hronny/depot

1 个答案:

答案 0 :(得分:1)

问题是您的索引操作路由仅响应GET请求(这是默认行为),但您要做的是向此操作提交表单(默认情况下是POST请求)。

有两种方法可以解决此问题

  1. 根据您的要求相应地设置您的路线:

    match 'store/index', to: 'store#index', via: [:get, :post]
    
  2. 让表单提交GET请求而不是默认的POST请求

    <%= form_tag store_index_path, class: 'locale', method: 'GET' do %>
    
  3. 修改

    顺便说一句,我不明白你在这里要做什么:

        if params[:set_locale]
          redirect_to store_index_url(locale: params[:set_locale])
        else
          @products = Product.order(:title)
        end
    

    这只是将它重定向到与params [:locale]相同的动作,然后你最终得到的是Product.order(:title)。另外,我还没读过这本书。