2009-03-11 28 views
8

Tôi đang lộn xộn với đường ray 2.3 mẫu và muốn có thể sử dụng tên ứng dụng dưới dạng biến trong mẫu của tôi, vì vậy khi tôi sử dụng ...
rails appname -m path/to/template.rb
... Tôi muốn có thể truy cập tên ứng dụng bên trong template.rb. Bất cứ ai biết làm thế nào để làm điều này?
Cảm ơnTruy cập tên ứng dụng từ bên trong mẫu đường ray khi tạo ứng dụng đường ray

Trả lời

8

Cảm ơn câu trả lời. Mike Woodhouse, bạn đã rất thân thiết. Hóa ra, tất cả các bạn cần làm để truy cập appname từ bên trong mẫu ray của bạn là ...

@root.split('/').last 

Biến @root là điều đầu tiên tạo ra khi khởi tạo mẫu và có sẵn bên đường ray mẫu của bạn. RAILS_ROOT không hoạt động.

1

RAILS_ROOT sẽ cung cấp cho bạn đường dẫn tuyệt đối vào thư mục gốc của bạn. Tên ứng dụng của bạn sẽ là phần của chuỗi sau '/' cuối cùng mà bạn có thể lấy theo bất kỳ cách nào.

CHỈNH SỬA: Không đủ để hoàn thành công việc. Mike và Dan viết nó ra bên dưới.

3

Có lẽ một cách đơn giản hơn, nhưng điều này dường như làm việc:

RAILS_ROOT.split('/').last 

EDIT: Bleah - đây đã bình chọn xuống một lần, và các cử tri đã đúng. Nếu tôi đọc câu hỏi cẩn thận hơn, tôi đã nhận thấy các phần tử 2.3 và template.rb. Xin lỗi.

Tôi cho rằng RAILS_ROOT sẽ không được tạo tại thời điểm bạn cần tên ứng dụng. Nhìn vào ruby\lib\ruby\gems\1.8\gems\rails-2.2.2\bin\rails, tuy nhiên, hầu hết các điều đầu tiên xảy ra là thế này:

app_path = ARGV.first 

Nó được sử dụng ở phần cuối của kịch bản để cho phép một chdir và đóng băng được thực hiện nếu cần thiết - Tôi không biết tôi có thể Insta -Đóng băng lúc sáng tạo, vì vậy tôi đã học được điều gì đó mới ít nhất. ARGV sau đó được sử dụng ở đây:

Rails::Generator::Scripts::Generate.new.run(ARGV, :generator => 'app') 

đó nhanh chóng được chúng ta đến nơi argv thực sự xử lý:

rails-2.3.1\lib\rails_generator\scripts.rb 

nơi tôi thấy

Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke! 

Một nơi nào đó dưới đây có lẽ là nơi templating được xử lý. Tôi e rằng tôi đang ở giai đoạn rất sớm với 2,3 và khuôn mẫu là một lĩnh vực mà tôi chưa xem xét.

Điều đó có giúp ích gì hơn nỗ lực đầu tiên của tôi không?

0

Tôi tin rằng cách ưu tiên bây giờ là gọi Rails.root và không còn RAILS_ROOT nữa. Rõ ràng một người nào đó trên đường ray hành tinh có ác cảm với chữ hoa hoặc một số lý do quan trọng tương tự. Tính đến 2.3.5, cả hai dường như hoạt động.

15

Tôi đang tìm câu trả lời cho câu hỏi này. không may câu trả lời ở trên (@root) dường như không hoạt động trong Rails 3.

Dưới đây là các biến bạn có thể truy cập trong Rails 3 mẫu ứng dụng (thậm chí dễ dàng hơn):

@app_name 
@app_path 
0

tôi đã nhận được lỗi

`template': undefined local variable or method `app_name' 

ruby ​​1.9.2p290, Rails 3.2.11, thor 0.18.0, Windows

nhưng với đường ray 2.3 máy phát điện:

class DynanavGenerator < Rails::Generators::Base 

(có thể Không chắc liệu lỗi này có xảy ra dưới đường ray 3.0.9 hay cũ hơn) định nghĩa lớp đã thay đổi thành:

class DynanavGenerator < Rails::Generators::NamedBase 

mà sau đó đã đưa:

Không có giá trị cung cấp cho các đối số cần thiết 'tên'

sau đó tôi đã thêm một 'danh' ("cái gì đó" dưới đây):

rails generate dynanav something --force 

đã đưa ra lỗi ban đầu, vì vậy tôi đã thêm:

def app_name 
    @name.titleize 
end 

vào lớp học và tất cả đều tốt.

3

Tôi chạy vào một vấn đề tương tự, không ai trong số các biến được liệt kê ở trên là có sẵn cho tôi trong Rails 4. Tôi thấy rằng @name đã có sẵn trong khi chạy

rails plugin new engines/dummy -m my_template.rb 

Có biến hữu ích khác có sẵn từ bên trong mẫu . Bạn có thể xem cho chính mình và chơi xung quanh bằng cách sử dụng pry. Bên trong mẫu của tôi, tôi thêm

require 'pry'; binding.pry 

và sau đó chạy ls để hiển thị một danh sách các biến Ví dụ có sẵn

ls -i 
instance variables: 
    @_initializer   @app_path @behavior @destination_stack @extra_entries @name   @output_buffer @shell 
    @_invocations   @args  @builder @dummy_path   @gem_filter  @options  @rails_template @source_paths 
    @after_bundle_callbacks @author @camelized @email    @in_group  @original_name @shebang 
+0

Câu trả lời này là thời gian chứng minh, nên một trong những hàng đầu –

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