Custom action in Rails 3

Hi, everyone. I’m working on a program in Rails 3.0.10 and it has a
custom action, “run_files”, that extracts data in files and saves it in
database. When I clicked the link on the page, it returned an error
page:
ActiveRecord::RecordNotFound in ReportsController#show
Couldn’t find Report with ID=run_files

I wonder why Rails rendered show instead of the custom action.
Following is the view file, route file and the output of rake routes.

index.html.erb
<%= link_to “Process Files”, :controller => ‘reports’, :action =>
‘run_files’ %>

routes.rb
match “reports/run_files” => “reports#run_files”, :via => :post
resources :reports

output of rake routes
reports_run_files POST /reports/run_files(.:format)
{:controller=>“reports”
, :action=>“run_files”}

Thanks in advance.

You have the route specified to only accept POST requests, but by using
link_to, you’re creating a hyperlink that generates a GET request.

You’ll need to either change your routes to accept a GET request, or
change
your method of calling the URL to a POST request (from a form).

Tim S. wrote in post #1023170:

You have the route specified to only accept POST requests, but by using
link_to, you’re creating a hyperlink that generates a GET request.

You’ll need to either change your routes to accept a GET request, or
change
your method of calling the URL to a POST request (from a form).

Thanks Tim. I tried both and they work! But I noticed that it
generated one more sql query when a GET request’s sent than that when a
POST request’s sent.
<-[1m<-[35mSQL (0.0ms)<-[0m SELECT name FROM sqlite_master WHERE
type = ‘table’ AND NOT name = ‘sqlite_sequence’

Where is it from and is it possible to skip it?

That query is nothing to worry about. It’s just rails running a query to
figure out which tables you have in your database so it can figure out
which
columns they have so it can make your models work properly.

In production it should only run once (when the server is first
started).
But then again you probably shouldn’t be using sqlite in production.