我知道这是一个微不足道的问题。但是我在谷歌搜索但找不到这个问题的简单答案。
基本上我在视图中有一行<%= link_to 'Run it', :method => 'doIt' %>
,然后在相应的控制器中,我有doIt
方法,如下所示:
def doIt
puts "Just do it"
end
我只是想检查一下,如果我点击Run it,它将输出字符串“Just do it”。我在localhost上运行它并且没有错误,但我无法在任何地方找到输出“Just do it”。它不会显示在rails控制台或rails服务器日志中。我只是想知道输出字符串的位置,在哪里找到它?
第2轮:所以这就是我试过的......
在index.html.erb(这是根)中添加了这一行
<%= link_to 'Run it', :method => 'do_it' %>
并且在网址中,它基本上只是http://localhost:3000/(因为我将控制器#index路由为root)
显示只是一个带下划线的'Run it',它链接到控制器中的'do_it'方法。
在控制器中,我包含此方法
def do_it
logger.debug "Just do it"
end
当我点击“运行它”时,网址将更改为http://localhost:3000/gollum_starters?method=do_it,并在development.log中写入以下内容:
Started GET "/gollum_starters?method=do_it" for 127.0.0.1 at 2011-08-25 15:27:49 -0700
Processing by GollumStartersController#index as HTML
Parameters: {"method"=>"do_it"}
[1m[35mGollumStarter Load (0.3ms)[0m SELECT "gollum_starters".* FROM "gollum_starters"
Rendered gollum_starters/index.html.erb within layouts/application (3.6ms)
Completed 200 OK in 16ms (Views: 7.7ms | ActiveRecord: 0.3ms)
另外,我尝试了所有的logger.error / info / fatal / etc ...和Rails.logger.error / info / fatal / etc,都没有在开发日志中打印出“Just do it”这一行
@Paul:我没有触摸环境文件夹或文件,我假设默认情况下创建一个新的rails应用程序,它正在开发中?
@Maz:是的你是对的,我只是想测试do_it方法是否被调用。为此,我只想在控制器中打印出一些东西。想不出任何简单的方法只是打印出一个字符串,但这个问题让我痛苦不堪。我只是使用textmate,没有IDE。
第3轮:
@Paul thx很多,但我遇到了错误
我的路线文件现在是:
resources :gollum_starters
root :to => "gollum_starters#index"
match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it'
我的index.html.erb现在是:
<%= link_to "Do it", do_it_path %>
我的gollum_starters_controller.rb
def do_it
logger.debug 'Just do it'
end
我收到此错误:
无法找到ID = do_it
的GollumStarter
错误在这里,第二行:
def show
@gollum_starter = GollumStarter.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @gollum_starter }
end
end
我想知道它为什么路线显示?当我点击do_it时,它实际上转到localhost:3000 / gollum_starters / do_it这是正确的,但显然错误指向show方法?
第4轮:
@Paul,我转移了资源:gollum_starters down:
root :to => "gollum_starters#index"
match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it'
resources :gollum_starters
但得到了这个错误(我希望自杀),
缺少模板
缺少模板gollum_starters / do_it {:handlers =&gt; [:erb,:rjs, :builder,:rhtml,:rxml],:formats =&gt; [:html],:locale =&gt; [:en,:en]} in 查看路径“〜/ project_name / app / views”
:/
---------- 回答第4轮 ------------
基本上,正如错误所解释的那样,没有模板(即网页)显示因此引发的错误。解决方案是添加redirect_to,在这种情况下,我重定向到root_url。
def do_it
logger.debug 'Just do it'
redirect_to(root_url)
end
现在一切正常,“Just do it”最终输出到development.log和rails服务器控制台。
谢谢Maz,Paul和Andrew帮助我。学到很多东西。
答案 0 :(得分:4)
link_to
没有按照您的想法执行:method
的值是指HTTP
动词。
取自ActionView::Helpers::UrlHelper
的文档:方法 - HTTP动词的符号。支持的动词有:post,:get,:delete和:put。默认情况下,它将是:post。
您需要在routes.rb
文件中定义使用您的方法
# The order of routes is important as the first matched will be used
# therefore the match needs to be above 'resources :controller'
match 'controller/do_it' => 'controller#do_it', :as => 'do_it'
resources :gollum_starters # <--- This needs to be below the match or this will catch first
controller/do_it
是要匹配的路线controller#do_it
是控制器,后跟要使用的操作(由#
分隔):as
的值会创建可在do_it_path
link_to
您的link_to
可能看起来像
<%= link_to "Do it", do_it_path %>
要完成请求的生命周期,您需要添加要呈现的view
app/views/gollum_startes/do_it.html.erb # <-- Add file
<强>摘要强> 所有这些只是为了将日志打印到日志中而造成一些混乱,但它应该可以帮助您现在更好地理解整个生命周期。此外,这些答案可以作为一份文件来帮助您摆脱这种混乱。
答案 1 :(得分:2)
您不了解“方法”在链接上下文中的含义。
这里的“方法”是指request method,这意味着您要求浏览器提出的请求。从像Rails这样的RESTful应用程序的角度来看,有四种相关的请求类型:GET,POST,PUT和DELETE。这些请求类型会影响控制器响应请求的方式。
还有另外两个“标准”导轨动作,NEW和EDIT。这些是向用户呈现界面的GET请求。 NEW为您提供POST(创建)新对象的表单,EDIT为您提供PUT(更新)和现有表单。
有关HTTP Verbs如何与CRUD操作相关的更多信息,请参阅the rails guide。
要理解的重要,基本的事情是,默认情况下,链接是GET请求,默认情况下,表单是POST请求。
所以,当你的链接看起来像这样:
<%= link_to 'Run it', :method => 'do_it' %>
......这是假的。没有像“do_it”这样的HTTP方法,所以你不会触发任何东西。因为没有这样的方法,Rails实际上将此作为URL的参数传递。因此,如果您点击它,您应该会看到您的网址栏最后显示?method=do_it
。
您尝试做的事情有几个问题。首先,the link_to helper期望至少有两个参数:1,链接的文本,2链接的HREF。所以,你真的需要使用:
link_to 'Run it', url
其次,您需要知道要传递哪个URL才能使控制器动作。
请熟悉以下导轨约定:在引用控制器操作时,您可以使用以下格式缩写它:controller_name#controller_action
。例如pages#show
或articles#index
。
假设您的控制器被调用ExamplesController
,您可以手动触发七个标准控制器操作,如下所示:
link_to 'examples#index', '/examples'
link_to 'examples#show', '/examples/123' # 123 is the id of a specific example
link_to 'examples#new', '/examples/new'
link_to 'examples#create', '/examples', :method => :post
link_to 'examples#edit', '/examples/123/edit'
link_to 'examples#update', '/examples/123', :method => :put
link_to 'examples#destroy', '/examples/123', :method => :delete
请注意,在上面,INDEX,SHOW,NEW和EDIT都是GET请求。您可以指定:method => :get
,但这是不必要的
要抽象出来并在需要时负责分配ID,Rails提供path helpers。
因此,要使用路径助手重复上述步骤,您可以使用:
link_to 'examples#index', examples_path
link_to 'examples#show', example_path( @example )
link_to 'examples#new', new_example_path
link_to 'examples#create', examples_path, :method => :post
link_to 'examples#edit', edit_example_path( @example )
link_to 'examples#update', example_path( @example ), :method => :put
link_to 'examples#destroy', example_path( @example ), :method => :delete
现在,您从路由器获取这些路径助手,并在routes.rb
文件中定义它们。在该文件中,如果您定义:
resources :examples
...然后你将获得上面的所有path_helpers。
如果您正在使用普通的RESTful控制器并且想要添加自定义操作,那么您需要做出一个决定:操作是对该控制器处理的整个对象集(如索引)还是仅对单个操作进行操作具体的(如秀)。这很重要的原因是它告诉路由器您所定义的新操作是否需要在请求中接收记录ID。
如果要对整个对象集合进行操作,请定义:
resources :examples do
collection do
get 'do_it'
end
end
如果您只想对您定义的集合中的一个成员采取行动:
resources :examples do
member do
get 'do_it'
end
end
我在上面的示例中写了'get'你可以使用四个动词中的任何一个 - GET通常是你想要显示一个页面时所做的,而POST通常是我用的,如果你是提交表格。你也可以写下这样的速记:
resources :examples do
get 'do_it', :on => :collection
post 'something', :on => :member
end
有关定义自定义控制器操作的更多信息,请参阅the rails guide。
现在您已经定义了路由,您应该在终端中运行rake routes
以查看新路径帮助程序的名称。假设您添加了do_it
作为集合方法,您的路径助手将是:do_it_examples_path
。
现在,回到你的链接,如果你把:
<%= link_to 'Do it.', do_it_examples_path %>
...然后你会触发do_it
动作。触发操作时,puts
通常应呈现给服务器日志(假设您在终端窗口中运行rails s,您应该在started GET on examples#do_it
...之后立即看到它。)
现在,在浏览器中,您会得到一个丢失的模板错误,因为GET请求将会呈现一个视图,但这是另一个问题的主题。基本上,现在你应该了解控制器的动作是什么,你是怎么做到的。如果您想了解有关如何处理控制器操作的更多信息,请see the guide:)
我希望你了解现在发生了什么。随意提问。
答案 2 :(得分:-1)
您想使用Rails日志记录机制:
http://guides.rubyonrails.org/debugging_rails_applications.html#sending-messages
这意味着即使您没有使用rails s
启动服务器,输出仍会转到正确的位置。