2012-04-10 20 views
5

Tôi đã tìm kiếm qua Stack Overflow trong vài giờ, nhưng không có câu hỏi nào liên quan đến vấn đề của tôi.Biến thể hiện bổ sung trong bộ điều khiển là 0 không?

Tôi mới làm quen với Rails, đây là dự án thực sự đầu tiên của tôi và tôi có thể khó hiểu việc thiết lập MVC một chút. Tôi đang cố gắng gán biến @stars dụ trong khi trong một hành động của searches_controller.rb:

def create 
    @search = Search.new(params[:search]) 
    tempstr = searchstr(@search) 
    @stars = Star.where("tempstr", :limit => 100) 
end 

@search được tạo ra tốt đẹp, là một tìm kiếm phức tạp với các thông số khác nhau. tempstr chỉ là một vùng chứa chuỗi đơn giản cho kết quả của searchstr(@search), là một phương pháp nhanh chóng để chuyển đổi các tham số tìm kiếm thành một chuỗi liên quan đến MySql (có vẻ dễ hơn sử dụng helper .where bình thường). Tôi chắc chắn rằng tôi chỉ có thể đặt searchstr(@search) trực tiếp vào. Where, nhưng bây giờ tôi chia chúng ra để tôi có thể kiểm tra các phần tử khi chúng đi qua.

Dù sao thì, vấn đề xuất hiện khi tôi cố gắng gọi @stars trong chế độ xem show.html.erb. Ngay cả với một cái gì đó đơn giản như thế này:

<% @stars.each do |star| %> 
    <%= display stuff %> 
<% end %> 

Tôi gặp lỗi khi nói 'each' is not a method of nil:NilClass. Vì vậy, tôi đã thay đổi nó như sau để xem nếu @stars là con số không:

<%= @stars.inspect %> 

đủ chắc, @starsnil. Tuy nhiên, khi tôi thêm dòng này vào bộ điều khiển của tôi để kiểm tra @stars có:

return render @stars.each 

Tôi thấy rằng các biến được làm đầy với các đối tượng sao đúng từ Star.where(), cũng giống như tôi đã dự định. Một .inspect nhanh cho thấy biến không phải là nil, khi trong bộ điều khiển.

Vì vậy, tôi không chắc chắn lý do vì sao chế độ xem nhận được nó là không nếu nó đã được xác định trong bộ điều khiển tốt. Tôi sẽ không ngạc nhiên nếu đó là tôi hiểu lầm cách MVC hoạt động, mặc dù. Lớp Star được định nghĩa trong mô hình Ngôi sao, nhưng có lẽ đó là vì tôi đang cố gắng truy cập nó từ bộ điều khiển Tìm kiếm, và do đó nó không được khởi tạo cho khung nhìn?

Tôi có nên thực hiện việc này theo cách khác không? Tôi đã cố gắng sử dụng biến cục bộ (sử dụng stars thay vì @stars), nhưng sau đó chế độ xem cho biết "Biến hoặc phương thức 'dấu sao địa phương chưa xác định".

Bất kỳ sự trợ giúp nào cũng được đánh giá cao, tôi đã từng đánh cắp bộ não của mình hàng giờ để tìm kiếm phức tạp và phân tích dữ liệu tệp sao vào cơ sở dữ liệu, vì vậy tôi bị đốt cháy một chút. Tôi có thể cung cấp thêm thông tin nếu được yêu cầu, tôi không chắc những gì khác sẽ hữu ích trong việc cung cấp câu trả lời.

+0

Vâng, bạn chắc chắn không muốn <% = @ stars.each%>; đó là một lỗi đánh máy? Ngoài ra, '" # {tempstr} "' khi 'tempstr' đã là một chuỗi là một chút dư thừa. Nếu bạn đăng nhập hoặc 'pry' trong bộ điều khiển thì' @ stars' thực sự chứa giá trị? –

+0

@Dave Newton - Đối với một, cảm ơn vì đã bắt tempstr; Tôi đã có nghĩa là ban đầu để làm các. Với cú pháp đường ray, mà sẽ có nhu cầu đánh giá. Đối với 2, các = trong có một lỗi đánh máy, và tôi sẽ sửa chữa đó trong câu hỏi, cảm ơn một lần nữa. Đối với 3, sử dụng 'logger.debug' để xuất '@stars.each do | star | star.ra end' (nơi 'star.ra' là một trong những biến sao) dường như đã ghi lại toàn bộ nội dung của @stars, bao gồm tất cả các biến của 2 sao mà. where được cho là tìm. Tôi nghĩ điều đó có nghĩa là nó có chứa các giá trị, mặc dù nó có thể nhận được nó từ một nơi khác, tôi cho rằng? – Xadera

Trả lời

3

Bạn đang đặt @stars theo phương pháp create, nhưng chế độ xem bạn đang nói đến là show.html.erb. Thử đặt @stars trong phương thức show. Một cái gì đó như thế này:

def show 
    @search = Search.find(params[:id]) 
    tempstr = searchstr(@search) 
    @stars = Star.where("tempstr", :limit => 100) 
end 

Nếu điều này không giúp bạn, vui lòng chỉ cho bạn các hành động điều khiển còn lại để chúng tôi có thể giúp bạn tốt hơn.

+0

Có, bạn đã hoàn toàn chính xác! Tôi đã tự tìm ra nó không lâu trước khi bạn đăng, nhưng cảm ơn rất nhiều vì đã trả lời và xác nhận! Ban đầu tôi đã nghĩ trang Hiển thị sẽ tự động sử dụng phương thức Tạo khi khởi tạo từ đó, nhưng tôi đã sai. Một sai lầm đơn giản làm tôi mất nhiều thời gian để nấu bộ não của mình. – Xadera

+0

bạn trả lời đã giúp tôi giải quyết hoàn toàn không liên quan đến vấn đề đường ray. bạn xứng đáng được nâng lên: D – kubbing

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