Rails重定向新操作

时间:2011-11-04 12:08:00

标签: ruby-on-rails ruby

对于铁路来说非常新。我一直在关注一本有很多帮助的书,但我无法弄清楚:

我有一个控制器技术,里面有一些动作(方法):

def patadas
    @technique = Category.find(4).technique
end

def golpes
    @technique = Category.find(3).technique
    respond_to do |format|      
        format.html { redirect_to(patadas_path) } 
    end
end

我们的想法是拥有一个页面,我可以在其中发送不同的技术,然后呈现它们。 patadas.html.erb页面中包含以下内容:

[some html]

<% if @technique then %>
        <% @technique.each do |p| %>
            (<%= p.order %>) <%= p.korean %> - <%= p.spanish %><br />
        <% end %>
    <% else %>
        No techniques specified to show!    
    <% end %>

我的问题在于重定向。我希望能够向同一页面发送不同的方法(显然我必须将其重命名为技术或patadas之外的其他方法)并让它呈现与所调用方法相对应的技术。现在重定向被执行,但它总是显示patadas方法。

哦,我在routes.rb文件中有这个:

match '/patadas' => 'techniques#patadas', :as => 'patadas'
match '/golpes' => 'techniques#golpes', :as => 'golpes'

我见过的所有教程和书籍等解释了如何为每个动作的一个视图做这个,但这真的很浪费,我想要一个视图来处理所有这些不同的动作。通过上述路线,我理解如果我构建另一个名为'golpes.html.erb'的视图,它会渲染它们,但我正在寻找一个具有不同动作的视图。

感谢。

PS 此外,是否有可能有这样的事情:

@frontal.each { |p| puts "(#{p.order}) #{p.korean} = #{p.spanish}" }

在视图(html.erb)文件中?它比上面打开和关闭的疯狂更加优雅&lt;%=%&gt;标签。有了Ruby之美,使用这样的语法似乎很浪费。我肯定必须有,但我还没有那么先进:)

编辑:鉴于我所做的所有更改(为类别创建了一个脚手架),我正在重写问题以使事情更清晰。所以现在这就是我所拥有的:

categories_controller.rb

[ bunch of stuff ]

def show
    @category = Category.find(params[:id])
  end

的routes.rb

resources :categories

在show文件中,我想按ID列出所有类别 /categories/show.html.erb文件:

I want to get category.order, category.category, category.spanish to show here
<%= link_to 'Edit', edit_category_path(@category) %> |
<%= link_to 'Back', categories_path %>

请原谅我的愚蠢,但我无法弄清楚要在此文件中添加什么来列出内容。如果我尝试做类似的事情:

<% @category.each do |cat| %>
    <li><%= cat.category %> - <%= cat.spanish %></li>           
<% end %>

我收到错误

undefined method `each' for #<Category:0x007f81c42a3fd0>

(最初的问题与路线有关,我错误地想要路线来处理不同的动作,这实际上是用show模板完成的,因此是jimworm的答案。我为了清晰起见编辑了这个问题,因为我改变了很多东西,但是真的不记得原来的措辞,对不起)

1 个答案:

答案 0 :(得分:1)

欢迎使用Rails方式,如果您仍然卡住,请询问更多。

重定向是重定向,请求之间不保留任何信息。看起来你正试图列出每个类别的技术?请记住,您拥有的唯一输入是类别,而不是与技术有关。在这种情况下,我建议使用嵌套路由。

# config/routes.rb
# this gives you the route /categories/:category_id/techniques, among other things
resources :categories do
  member do
    resources :techniques
  end
end

# app/controllers/techniques_controller.rb
# note that this is only called from inside the nested route
# so params[:category_id] is available
class TechniquesController < ActionController::Base
  def index
    @category = Category.find params[:category_id]
    @techniques = @category.techniques
  end
end

# app/views/techniques/show.html.erb
<% @techniques.each do |technique| %>
  <p>(<%= technique.order -%>) <%= technique.korean -%> - <%= technique.spanish -%></p>
<% end %>

请注意使用params[:category_id]而不是固定路由名称。您总是可以使用friendly_id通过slug而不是整数来查找类别。

https://github.com/norman/friendly_id

编辑:一次一个地解决您的评论(但不是正确的顺序):

在Rails惯例中,techniquetechniques之间存在很大差异。经验丰富的Rubyist永远不会列出技术列表technique,因为这只是令人困惑! Technique的实例必须是技术,可以这么说,如果该模型的每个实例中有多种技术,您可以将其称为TechniqueList或{ {1}}或其他什么。

您要求的是在类别的TechniqueGroup操作中显示技术列表。在这种情况下,您将不需要嵌套路由。您可以使用相同的方法显示特定技术的类别列表(假设您在类别和技术之间存在多对多关系)。

show

子类别:它们是什么?一个模型?查询# app/controllers/categories_controller.rb class CategoriesController < ActionController::Base def show # `includes` joins the techniques table, avoids n+1 lookups @category = Category.includes(:techniques).find params[:id] end end # app/views/categories/show.html.erb <% @category.techniques.each do |technique| %> <p>(<%= technique.order -%>) <%= technique.korean -%> - <%= technique.spanish -%></p> <% end %> 模型?我将在下面的代码中将其视为一个查询。

Category