通过“使用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
答案 0 :(得分:1)
问题是您的索引操作路由仅响应GET请求(这是默认行为),但您要做的是向此操作提交表单(默认情况下是POST请求)。
有两种方法可以解决此问题
根据您的要求相应地设置您的路线:
match 'store/index', to: 'store#index', via: [:get, :post]
让表单提交GET请求而不是默认的POST请求
<%= form_tag store_index_path, class: 'locale', method: 'GET' do %>
修改强>:
顺便说一句,我不明白你在这里要做什么: if params[:set_locale]
redirect_to store_index_url(locale: params[:set_locale])
else
@products = Product.order(:title)
end
这只是将它重定向到与params [:locale]相同的动作,然后你最终得到的是Product.order(:title)
。另外,我还没读过这本书。