2009-09-23 20 views
10

Trong điều khiển Grails của tôi, tôi đang trả lời một cuộc gọi AJAX và sử dụng render để trả lại văn bản:Grails "render" ám chỉ rằng mẫu

def ajaxRandomPersonName = { 
    def person = get a random person ... 
    render "Name: ${person.name}" 
} 

Vấn đề là render làm cho toàn bộ mẫu. Vì vậy, thay vì chỉ hiển thị "Tên: John", nó sẽ hiển thị tất cả các biểu tượng, điều hướng, v.v. được xác định trong mẫu. Làm thế nào để tôi nhận được render để chỉ hiển thị mà không có mẫu?

Tôi đang theo dõi Chương 1 của "Grails in Action" (trang 28) sử dụng Grails 1.1.1.

Theo dõi: Trả về false theo đề xuất của Rhysyngsun không có tác động. Tôi cũng cố gắng thiết lập mẫu để null nhưng nó vẫn ám chỉ rằng mẫu:

def ajaxRandomPersonName = { 
    def person = get a random person ... 
    render (template:null, text:"Name: ${person.name}") 
} 

render có tim cong của nó trên làm cho nó thông qua các mẫu không có vấn đề gì tôi làm.

Theo dõi 2: Parallel discussion trong danh sách gửi thư của người dùng grails.

Theo dõi 3: Mã mẫu: Tôi đã ghép mã của tôi xuống mức tối thiểu và vẫn hiển thị mẫu không mong muốn.

controllers/PersonController.groovy:

class PersonController { 
    def index = { } 
    def home = { [message:"Hello"] } 

    def ajaxTest = { 
     println "ajaxTest called" 
     render text: "ajax message" 
    } 
} 

views/người/home.gsp (xem trang cho phương pháp nhà)

<html> 
<head> 
    <title>Home View</title> 
    <g:javascript library="prototype" /> 
</head> 
<body> 
    <p> 
     <g:remoteLink action="ajaxTest" update="test1">ajax call</g:remoteLink> 
    </p> 
    <p>Message = ${message}</p> 
    <p id="test1">Blank</p> 
</body> 
</html> 

views/layouts/person.gsp (bố trí mẫu cho người bộ điều khiển)

<html> 
<head> 
    <title>Test App - <g:layoutTitle/></title> 
    <g:layoutHead/> 
</head> 
<body> 
    <h1>Test App</h1> 
    <g:layoutBody/> 
</body> 
</html> 

Tôi truy cập trình điều khiển người có chế độ xem nhà: http://localhost:8080/test/person/home

trang này hiển thị như: thử nghiệm App gọi ajax (siêu liên kết) nhắn = Xin chào Trống

"Test App" là từ mẫu. Khi tôi nhấp vào "ajax gọi" nó làm cho một cuộc gọi không đồng bộ đến phương pháp ajaxTest PersonController của (xác minh với println). Tất cả ajaxTest làm là println và hiển thị văn bản tĩnh. Kết quả này trong các trường hợp sau:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

Lưu ý rằng mẫu được hiển thị trong "Test App" thứ hai.

Tôi đang chạy Grails 1.1.1. Bất kỳ ý tưởng? Mã có vẻ đơn giản. Tôi đã tải xuống nguồn Grails và xem RenderDynamicMethod.java. Nó không làm bất kỳ mẫu vẽ nào trừ khi mẫu nằm trong danh sách đối số, mà nó không phải là. Vì vậy, chỉ đoán của tôi là một cái gì đó lên hơi nước là rendering mẫu một lần nữa.

Trả lời

13

Đã giải quyết: Thêm các kết quả contentType trong mẫu không được hiển thị:

render text: "Name: ${person.name}", contentType: "text/plain" 
+1

bạn biết điều này như thế nào? –

+4

Có, vui lòng giải thích về nơi bạn tìm thấy câu trả lời này. Một lưu ý phụ, Đó là một sự xấu hổ tuyệt đối mà chương 1, mà phải mất tôi 30 phút, đã đưa tôi giờ để hoàn thành. Và, tôi hoàn toàn thất vọng bởi cú đâm đầu tiên của tôi tại Grails –

0

Chúng tôi đã phát hiện thấy rằng trả về sai từ hành động sửa lỗi này.

Tôi tin rằng thực hiện hiển thị foo khi JSON trả về sai hoàn toàn.

+0

Tôi vừa thử trả về false sau khi kết xuất và nó vẫn hiển thị mẫu. –

3

Hãy phía khách hàng của bạn mã javascript xử lý một phản ứng JSON và đưa ra câu trả lời của bạn với:

làm [text: "Tên: $ {person.name}"] như JSON

2

Bạn có thể bị đốt cháy bởi tính năng 'bố cục theo ước tính' trong Grails. Nếu tên bố trí của bạn khớp với tiền tố tên bộ điều khiển, ví dụ, Grails sẽ áp dụng bố cục cho mọi chế độ xem được quản lý bởi bộ điều khiển đó. Thật không may, nó thậm chí còn áp dụng cho văn bản và mẫu. Hiện tại có một vài JIRAs đã đăng nhập về điều này (xem ví dụ http://jira.grails.org/browse/GRAILS-7624). Hôm nay tôi bị đốt cháy. Tôi đã giải quyết nó bằng cách đổi tên bố cục của tôi thành gsp sao cho nó không khớp với bất kỳ tên bộ điều khiển nào. Bố trí của tôi ban đầu được đặt tên là 'storefront.gsp' và tôi có một bộ điều khiển có tên StorefrontController. Tôi đã đổi tên bố cục thành 'public.gsp'.

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