2011-08-25 33 views
5

Tôi biết đây là một câu hỏi tầm thường. Nhưng tôi đã tìm kiếm trên google nhưng không thể tìm thấy một câu trả lời đơn giản cho câu hỏi này.Ruby on Rails: Cách in ra một chuỗi và nó hiển thị ở đâu?

Về cơ bản tôi có một dòng mà nói <%= link_to 'Run it', :method => 'doIt' %> trong giao diện, sau đó trong bộ điều khiển tương ứng, tôi có phương pháp doIt như sau:

def doIt 
    puts "Just do it" 
end 

Tôi chỉ muốn kiểm tra xem nếu tôi bấm vào Run nó, nó sẽ xuất chuỗi "Chỉ cần làm điều đó". Tôi chạy này trên localhost và không có lỗi, nhưng tôi không thể tìm thấy đầu ra "Chỉ cần làm điều đó" bất cứ nơi nào. Nó không được hiển thị trong bảng điều khiển đường ray hoặc nhật ký máy chủ đường ray. Tôi chỉ muốn biết nơi nào đặt đầu ra chuỗi, nơi để tìm thấy nó?


Vòng 2: Vì vậy, đây là những gì tôi đã cố gắng ....

gia tăng dòng này trong index.html.erb (mà là gốc rễ)

<%= link_to 'Run it', :method => 'do_it' %> 

và trong url, nó chỉ là về cơ bản http://localhost:3000/ (vì i route controller # index dưới dạng root)

Màn hình chỉ là một gạch chân 'Chạy nó' liên kết đến 'do_it 'phương pháp trong bộ điều khiển.

Trong bộ điều khiển, tôi bao gồm phương pháp này

def do_it 
    logger.debug "Just do it" 
end 

khi tôi bấm vào 'Run nó, sự thay đổi url để http://localhost:3000/gollum_starters?method=do_it và trong development.log, sau đây được viết vào nó:

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) 

Ngoài ra, tôi đã thử tất cả logger.error/info/fatal/etc ... và Rails.logger.error/info/fatal/etc, tất cả đều không in ra dòng "Chỉ cần làm" trong quá trình phát triển đăng nhập

@Paul: Tôi không chạm vào thư mục hoặc tệp môi trường, tôi giả định theo mặc định khi một ứng dụng đường ray mới được tạo, nó đang được phát triển?

@Maz: Có bạn đúng, tôi chỉ đang thử kiểm tra xem phương thức do_it có được gọi hay không. Để làm điều đó, tôi chỉ muốn in một cái gì đó ra trong bộ điều khiển. Không thể nghĩ ra bất kỳ cách nào đơn giản hơn mà chỉ cần in ra một chuỗi, nhưng vấn đề này khiến tôi khốn khổ. Tôi chỉ sử dụng textmate, không có IDE.


Vòng 3:

@ Paul thx rất nhiều, nhưng tôi gặp phải lỗi

file các tuyến đường của tôi bây giờ là:

resources :gollum_starters 

root :to => "gollum_starters#index" 

match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it' 

index.html.erb của tôi bây giờ là :

<%= link_to "Do it", do_it_path %> 

Gollum_starters_controller của tôi.rb

def do_it 
    logger.debug 'Just do it' 
end 

Tôi nhận được lỗi này:

Couldn't find GollumStarter with ID=do_it

lỗi là ở đây, 2nd dòng:

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 

Tôi tự hỏi tại sao nó lộ trình để hiển thị? Khi tôi nhấp vào do_it, nó thực sự đi đến localhost: 3000/gollum_starters/do_it đó là chính xác, nhưng dường như các lỗi điểm đến phương pháp hiển thị?


Vòng 4:

@ Paul, tôi chuyển nguồn: gollum_starters xuống:

root :to => "gollum_starters#index" 

match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it' 

resources :gollum_starters 

nhưng đã nhận lỗi này (omg tôi muốn giết bản thân mình),

Template is missing

Missing template gollum_starters/do_it with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} in view paths "~/project_name/app/views"

:/

---------- trả lời để Round 4 ------------

Về cơ bản như lỗi giải thích, không có mẫu (tức là một trang web) để hiển thị lỗi do đó bị ném. Giải pháp là thêm một redirect_to, trong trường hợp này tôi chuyển hướng đến root_url.

def do_it 
    logger.debug 'Just do it' 
    redirect_to(root_url) 
end 

Mọi thứ hoạt động ngay bây giờ, "Chỉ cần làm điều đó" cuối cùng kết quả đầu ra cho development.log và bảng điều khiển máy chủ đường ray.

Cảm ơn bạn Maz và Paul và Andrew đã giúp tôi. Học được rất nhiều.

+0

John, xem giải thích được thêm bên dưới. Bạn đang thiếu ý tưởng cốt lõi của REST trong Rails, và bạn sẽ hạnh phúc hơn nhiều với đường ray nếu bạn hiểu nó. Chúc may mắn :) – Andrew

+0

Yup nhìn vào nó, nhờ giải thích chi tiết –

Trả lời

4

Điều đó link_to không làm những gì bạn nghĩ rằng giá trị cho :method là tham chiếu đến các động từ HTTP.

Taken từ các tài liệu cho ActionView::Helpers::UrlHelper

:method - Symbol of HTTP verb. Supported verbs are :post, :get, :delete and :put. By default it will be :post.

Bạn sẽ cần phải xác định một lộ trình trong tập tin của bạn routes.rb có sử dụng phương pháp của bạn

# 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 
  • Các controller/do_it được con đường để được xuất hiện
  • controller#do_it là bộ điều khiển theo sau là hành động được sử dụng (se parated bởi #)
  • Giá trị cho :as tạo ra con đường do_it_path có thể được sử dụng trong bạn link_to

bạn link_to có thể trông giống như

<%= link_to "Do it", do_it_path %> 

Và để hoàn thành vòng đời của một yêu cầu bạn sẽ cần thêm view để được hiển thị

app/views/gollum_startes/do_it.html.erb # <-- Add file 

Tóm tắt Làm tất cả những điều này tạo ra một chút lộn xộn chỉ để in một cái gì đó ra các bản ghi, nhưng nó sẽ giúp bạn hiểu toàn bộ vòng đời tốt hơn bây giờ. Cộng với câu trả lời này phục vụ như một tài liệu để giúp bạn tua lại mớ hỗn độn này.

+0

Xin chào Paul, điều này có ý nghĩa, nhưng tôi gặp lỗi, xem bài đăng của tôi trên Vòng 3 –

+0

Xem câu trả lời cập nhật –

+0

Xin lỗi bạn đã gặp rắc rối. Có một lỗi mẫu bị thiếu khác, xem Vòng 4. –

-1

Bạn muốn sử dụng Rails cơ chế đăng nhập:

http://guides.rubyonrails.org/debugging_rails_applications.html#sending-messages

Điều này có nghĩa rằng ngay cả khi bạn không khởi động máy chủ sử dụng rails s đầu ra vẫn sẽ đi đến đúng nơi.

+0

nên về cơ bản 'đặt' là ruby ​​cụ thể. Nó không hoạt động trên ror mặc dù tôi sử dụng nó trong một tập tin .rb? –

+1

không, đặt gửi đầu ra đến STDOUT, hầu hết các lần STDOUT là thiết bị đầu cuối, nhưng đôi khi nó không. Trong trường hợp này thì không. đặt vẫn hoạt động, nó chỉ không xuất nội dung đến nơi bạn muốn nó xuất ra. Văn bản cuộn trong bảng điều khiển cũng được ghi vào nhật ký phát triển. Đó là để đăng nhập này, không phải để các thiết bị đầu cuối, mà bạn muốn ghi vào. – Maz

+0

Thx để giải thích. Tôi đã thử tất cả các logger này. (Debug | info | warn | error | fatal) và kiểm tra nhật ký phát triển cho nó, nhưng nó vẫn không ghi vào nhật ký. Tôi thậm chí đã làm ctrl-shift-f trên thư mục dự án của tôi và không thể tìm thấy nó đăng nhập bất cứ nơi nào ngoại trừ trong bộ điều khiển mà tôi đã làm logger.debug "Chỉ cần làm điều đó". Vì vậy, về cơ bản tôi bấm vào "Chạy nó", và phương pháp do_it (thay đổi từ doIt để theo quy ước đường ray) được gọi là, và tôi đã logger.debug/info/etc ... nhưng tôi kiểm tra nhật ký phát triển và "Chỉ cần làm điều đó "không được viết cho nó. –

2

Bạn không hiểu "phương thức" nghĩa là gì trong ngữ cảnh của liên kết.

"Phương thức" ở đây đề cập đến request method, có nghĩa là loại yêu cầu bạn yêu cầu trình duyệt thực hiện. Từ quan điểm của một ứng dụng RESTful như Rails có bốn loại yêu cầu liên quan: GET, POST, PUT và DELETE. Các loại yêu cầu này ảnh hưởng đến cách bộ điều khiển phản hồi yêu cầu.

  • GET => INDEX hoặc hiển thị
  • POST => CREATE
  • PUT => CẬP NHẬT
  • DELETE => DESTROY

Có hai khác "tiêu chuẩn" đường ray hành động, NEW và EDIT. Đây là những yêu cầu GET để trình bày một giao diện cho người dùng. NEW cung cấp cho bạn một biểu mẫu để POST (CREATE) một đối tượng mới và EDIT cung cấp cho bạn một biểu mẫu tới PUT (UPDATE) và một biểu mẫu hiện có.

Xem the rails guide để biết thêm về cách các động từ HTTP liên quan đến các hoạt động CRUD.

Điều quan trọng, cơ bản cần hiểu là các liên kết, theo mặc định, là các yêu cầu GET và các biểu mẫu theo mặc định là các yêu cầu POST.

Vì vậy, khi liên kết của bạn trông như thế này:

<%= link_to 'Run it', :method => 'do_it' %> 

... đó là không có thật. Không có phương thức HTTP như "do_it", vì vậy bạn không kích hoạt bất kỳ thứ gì. Vì không có phương thức như vậy, Rails thực sự chuyển nó thành một tham số của URL.Do đó nếu bạn bấm vào đó bạn sẽ thấy thanh url của bạn bây giờ nói ?method=do_it ở cuối.

Có một số vấn đề với những gì bạn đang cố gắng làm. Trước hết, the link_to helper mong đợi ít nhất hai đối số: 1, văn bản cho liên kết và 2 HREF cho liên kết. Vì vậy, bạn thực sự cần phải sử dụng:

link_to 'Run it', url 

Thứ hai, bạn cần biết URL nào cần chuyển để thực hiện hành động điều khiển của bạn.

Hãy làm quen với quy ước đường ray sau: Khi đề cập đến hành động của bộ điều khiển, bạn có thể viết tắt bằng cách sử dụng biểu mẫu: controller_name#controller_action. ví dụ. pages#show hoặc articles#index.

Giả sử điều khiển của bạn được gọi là ExamplesController, bạn có thể tự kích hoạt số bảy hành động điều khiển tiêu chuẩn như sau:

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 

Lưu ý rằng ở trên, INDEX, SHOW, MỚI, và EDIT đều yêu cầu GET. Bạn có thể chỉ định :method => :get nhưng điều đó không cần thiết

Để trừu tượng hóa điều này và chăm sóc gán ID khi yêu cầu Rails cung cấp path helpers.

Vì vậy, để lặp lại ở trên bằng cách sử dụng người giúp đỡ đường dẫn mà bạn có thể sử dụng:

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 

Bây giờ, bạn sẽ có được những người giúp đỡ đường đi từ router, và chúng được định nghĩa trong tập tin routes.rb của bạn. Trong tệp đó nếu bạn xác định:

resources :examples 

... thì bạn sẽ nhận được tất cả các path_helpers ở trên.

Nếu bạn đang sử dụng bộ điều khiển RESTful bình thường và bạn muốn thêm hành động tùy chỉnh, bạn cần thực hiện một quyết định: hành động có hoạt động trên toàn bộ các đối tượng được điều khiển bởi bộ điều khiển đó (như chỉ mục) hay chỉ duy nhất một cụ thể (như hiển thị). Lý do quan trọng là điều này cho router biết liệu hành động mới mà bạn đang định nghĩa có cần nhận ID bản ghi như một phần của yêu cầu hay không.

Nếu bạn muốn tác động lên toàn bộ bộ sưu tập của các đối tượng, bạn xác định:

resources :examples do 
    collection do 
    get 'do_it' 
    end 
end 

Nếu bạn muốn hành động trên chỉ là một thành viên duy nhất của bộ sưu tập bạn xác định:

resources :examples do 
    member do 
    get 'do_it' 
    end 
end 

đâu Tôi đã viết 'get' trong các ví dụ ở trên, bạn có thể sử dụng bất kỳ động từ nào trong số bốn động từ - GET thường là những gì bạn làm nếu bạn muốn hiển thị một trang và POST thường là những gì tôi sẽ sử dụng nếu bạn đang gửi biểu mẫu. Bạn cũng có thể viết tốc ký này như sau:

resources :examples do 
    get 'do_it', :on => :collection 
    post 'something', :on => :member 
end 

Để biết thêm về việc xác định các hành động điều khiển tùy chỉnh, xem the rails guide.

Bây giờ bạn đã xác định lộ trình, bạn nên chạy rake routes trong thiết bị đầu cuối để xem tên của trình trợ giúp đường dẫn mới.Giả sử bạn đã thêm do_it làm phương thức thu thập, trình trợ giúp đường dẫn của bạn sẽ là: do_it_examples_path.

Bây giờ sau đó, trở lại liên kết của bạn, nếu bạn đặt:

<%= link_to 'Do it.', do_it_examples_path %> 

... sau đó bạn sẽ kích hoạt các hành động do_it. Khi hành động được kích hoạt, puts thường sẽ hiển thị nhật ký máy chủ (giả sử bạn đang chạy đường ray trong cửa sổ đầu cuối, bạn sẽ thấy nó ngay sau started GET on examples#do_it ...).

Bây giờ, trong trình duyệt, bạn sẽ gặp lỗi mẫu bị thiếu khi yêu cầu GET dự kiến ​​sẽ hiển thị chế độ xem nhưng đó là chủ đề cho một câu hỏi khác. Về cơ bản, bây giờ bạn nên hiểu những hành động của bộ điều khiển là gì, cách bạn nhận được chúng. Nếu bạn muốn tìm hiểu thêm về những việc cần làm với hành động điều khiển của mình, see the guide :)

Tôi hy vọng bạn hiểu điều gì đang diễn ra. Hãy đặt câu hỏi.

Các vấn đề liên quan