Ruby on Rails:如何打印出一个字符串以及它在哪里显示?

Joh*_*Lee 6 ruby debugging console ruby-on-rails

我知道这是一个微不足道的问题.但我在谷歌搜索,但无法找到这个问题的简单答案.

基本上我有一行<%= link_to 'Run it', :method => 'doIt' %>在视图中说,然后在相应的控制器中,我有doIt如下方法:

def doIt
  puts "Just do it" 
end
Run Code Online (Sandbox Code Playgroud)

我只是想检查一下,如果我点击Run it,它将输出字符串"Just do it".我在localhost上运行它并且没有错误,但我无法在任何地方找到输出"Just do it".它不会显示在rails控制台或rails服务器日志中.我只是想知道输出字符串的位置,在哪里找到它?


第2轮:所以这就是我试过的......

在index.html.erb中添加了这一行(这是根)

<%= link_to 'Run it', :method => 'do_it' %>
Run Code Online (Sandbox Code Playgroud)

在网址中,它基本上只是http:// localhost:3000 /(因为我将控制器#index路由为root)

显示只是一个带下划线的'Run it',它链接到控制器中的'do_it'方法.

在控制器中,我包括这种方法

def do_it
  logger.debug "Just do it"
end
Run Code Online (Sandbox Code Playgroud)

当我点击"运行它"时,网址将更改为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)
Run Code Online (Sandbox Code Playgroud)

另外,我尝试了所有的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'
Run Code Online (Sandbox Code Playgroud)

我的index.html.erb现在是:

<%= link_to "Do it", do_it_path %>
Run Code Online (Sandbox Code Playgroud)

我的gollum_starters_controller.rb

def do_it
  logger.debug 'Just do it'
end
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

找不到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
Run Code Online (Sandbox Code Playgroud)

我想知道它为什么路线显示?当我点击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
Run Code Online (Sandbox Code Playgroud)

但得到了这个错误(我希望自杀),

模板丢失了

缺少模板gollum_starters/do_it与{:handlers => [:erb,:rjs,:builder,:rhtml,:rxml],:formats => [:html],:locale => [: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
Run Code Online (Sandbox Code Playgroud)

现在一切正常,"Just do it"最终输出到development.log和rails服务器控制台.

谢谢Maz,Paul和Andrew帮助我.学到很多.

Pau*_*l.s 4

link_to并没有达到你所认为的作用,:method即指的是HTTP动词。

取自ActionView::Helpers::UrlHelper的文档

:method - 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
Run Code Online (Sandbox Code Playgroud)
  • controller/do_it要匹配的路由
  • controller#do_it控制器,后跟要使用的操作(用 分隔#
  • 的值:as创建do_it_path可在您的link_to

你的link_to可能看起来像

<%= link_to "Do it", do_it_path %>
Run Code Online (Sandbox Code Playgroud)

要完成请求的生命周期,您需要添加view要渲染的

 app/views/gollum_startes/do_it.html.erb # <-- Add file 
Run Code Online (Sandbox Code Playgroud)

总结 执行所有这些操作只是为了将某些内容打印到日志中而造成一些混乱,但它现在应该可以帮助您更好地理解整个生命周期。另外,这个答案可以作为一个文档来帮助您扭转这个混乱局面。