我的rails app基本上显示了一个存储在数据库中的各种字典。我已经设置了一个带脚手架的基本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'方法 - 它总是试图通过控制器中早先默认定义的'Show'方法。
任何人都可以快速帮我解决这个问题吗?我对rails非常陌生,我根本不理解link_to的工作原理。
routes.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)'
答案 0 :(得分: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请求通过GET命中/words/:id
默认情况下是show动作,该请求中的params[:id]
将是“lettersearch”
答案 1 :(得分:0)
您可以在索引中运行搜索。我想这可能是你想要做的。在您的索引控制器中,您可以输入:
@orders = Order.lettersearch(params[:word])
然后在你的模型中:
def lettersearch(word)
if lettersearch
@word = Word.find(:all, :conditions => ["word LIKE ?", "#{word}%"])
else
all
end
end