0

我的 rails 应用程序基本上显示了存储在数据库中的各种字典。我已经设置了一个带有脚手架的基本 Rails 应用程序以在网页上显示它,但我一生都无法弄清楚如何设置它。基本上我想要一行 26 个字母,当你点击一个字母(比如“A”)时,我只想看到那个字母的字典条目。

我的 index.html.erb 文件:

<% for char in 'A'..'Z' %>
<%= link_to( "#{char}", "/words/lettersearch", :id => "#{char}") %>
<% end %>

我的 words_controller.rb 文件方法:

def lettersearch
    @word = Word.find(:all, :conditions => ["word LIKE ?", "#{params[:word]}%"])
end

然后它将@word 输出到另一个页面。

我的问题是它只是再次输出整个字典,无论我在索引页面上单击什么字母。我知道这与路由有关,因为它似乎从未真正运行过“lettersearch”方法——它总是试图运行控制器中默认定义的“显示”方法。

任何人都可以帮我快速解决如何通过这个路径吗?我对 Rails 很陌生,我根本不了解 link_to 的工作原理。

路线.rb:

Dictionary::Application.routes.draw do
  resources :words do

  post 'search', :on => :collection
  post 'lettersearch', :on => :collection
  end

#Rest of routes.rb still commented apart from
   match ':controller(/:action(/:id))(.:format)'
4

2 回答 2

2

您正在传入一个名为的参数,:id但在您的控制器中您使用了一个名为:word

此外,更新您的代码以使用更新的语法

World.where(["word like ?", "#{params[:id]}%"])

你的视图代码也可以被清理

<% for char in 'A'..'Z' %>
  <%= link_to char, "/words/lettersearch", :id => char %>
<% end %>

您的路由文件只有一个 POST 路由到字母搜索,但 link_to 是一个 GET 请求。所以发生的事情是 GET 请求/words/:id通过 GET 命中,这是默认的显示操作,并且该params[:id]请求的内部将是“lettersearch”

于 2013-10-30T15:32:27.923 回答
0

您可以在索引中运行搜索。我认为这可能是你想要做的。在您的索引控制器中,您可以放置​​:

@orders = Order.lettersearch(params[:word])

然后在你的模型中:

def lettersearch(word)

    if lettersearch
       @word = Word.find(:all, :conditions => ["word LIKE ?", "#{word}%"])
    else
       all
    end
end
于 2013-10-30T15:52:42.803 回答