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, @stars
là nil
. 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.
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ị? –
@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