2010-05-01 28 views
12

Tôi đã làm việc với Rails một thời gian và một điều tôi thấy mình liên tục làm là kiểm tra xem một số thuộc tính hoặc đối tượng là không trong mã xem của tôi trước khi tôi hiển thị nó . Tôi bắt đầu tự hỏi liệu đây có phải là ý tưởng hay nhất không.Kiểm tra xem nil xem trong Ruby on Rails

Lý do cơ bản của tôi cho đến nay là do (các) ứng dụng của tôi dựa vào những điều không mong muốn của người dùng vào có thể xảy ra. Nếu tôi đã học được một điều từ lập trình nói chung thì người dùng nhập những thứ mà lập trình viên không nghĩ đến là một trong những nguồn lỗi thời gian chạy lớn nhất. Bằng cách kiểm tra các giá trị nil tôi hy vọng sẽ tránh được điều đó và có quan điểm của tôi một cách duyên dáng xử lý vấn đề.

Vấn đề là mặc dù tôi thường vì nhiều lý do có kiểm tra giá trị nil hoặc không hợp lệ tương tự trong mã mô hình hoặc bộ điều khiển của tôi. Tôi sẽ không gọi nó là sự sao chép mã theo nghĩa hẹp nhất, nhưng nó không có vẻ rất khô. Nếu tôi đã kiểm tra các đối tượng nil trong controller của tôi thì có ổn không nếu view của tôi chỉ giả thiết đối tượng thực sự không phải là nil? Đối với các thuộc tính có thể là nil được hiển thị, điều đó có ý nghĩa với tôi để kiểm tra mọi lúc, nhưng đối với các đối tượng thì tôi không chắc thực hành tốt nhất là gì.

Dưới đây là một ví dụ đơn giản, nhưng điển hình về những gì tôi đang nói về:

mã điều khiển

def show 
    @item = Item.find_by_id(params[:id]) 

    @folders = Folder.find(:all, :order => 'display_order') 

    if @item == nil or @item.folder == nil 
     redirect_to(root_url) and return 
    end 
end 

chế độ code

<% if @item != nil %> 
    display the item's attributes here 

    <% if @item.folder != nil %> 
     <%= link_to @item.folder.name, folder_path(@item.folder) %> 
    <% end %> 
<% else %> 
    Oops! Looks like something went horribly wrong! 
<% end %> 

Đây có phải là một ý tưởng tốt hay là nó chỉ ngớ ngẩn?

Trả lời

6

bạn mã ví dụ remade:

mã điều khiển. (Tôi giả định này là ItemsController)

def show 
    # This will fail with 404 if item is not found 
    # You can config rails to pretty much render anything on Error 404 
    @item = Item.find(params[:id]) 

    # doesn't seem to be used in the view 
    # @folders = Folder.find(:all, :order => 'display_order') 


    # this is not needed anymore, or should be in the Error 404 handler 
    #if @item == nil or @item.folder == nil 
    # redirect_to(root_url) and return 
    #end 
end 

đang xem, kể từ bộ điều khiển chắc chắn chúng tôi có @item

#display the item's attributes here 

<%= item_folder_link(@item) %> 

mã giúp đỡ:

# display link if the item has a folder 
def item_folder_link(item) 
    # I assume folder.name should be a non-blank string 
    # You should properly validate this in folder model 
    link_to(item.folder.name, folder_path(item.folder)) if item.folder 
end 

Dù sao, tôi cố gắng giữ quan điểm rất rất đơn giản. Thông thường nếu tôi thấy các vòng lặp và điều kiện trong các khung nhìn, tôi cố gắng tái cấu trúc chúng thành những người trợ giúp.

5

Không yuu nên sử dụng

<% if @item.nil? %> 

ví dụ

@item1=nil 
if @item1.nil? ### true 
@item2 = "" 
if @item2.nil? ### false 
@item3 = [] 
if @item3.nil? ### false 
@item4 = {} 
if @item4.nil? ### false 

Để kiểm tra Một đối tượng là trống nếu đó là sai sự thật, trống rỗng, hoặc một chuỗi khoảng trắng.

sử dụng

<% if @item.blank? %> 

ref: - this

ví dụ

@item1=nil 
if @item1.blank? #### true 
@item2 = "" 
if @item2.blank? #### true 
@item3 = [] 
if @item3.blank? #### true 
@item4 = {} 
if @item4.blank? #### true 
0

điều khiển của bạn là chịu trách nhiệm về quyết định xem sẽ được trả lại. Nếu bạn có thể xác minh rằng trình điều khiển của bạn sẽ không bao giờ hiển thị chế độ xem cụ thể này mà không có mục hoặc item_folder thì bạn không cần phải kiểm tra giá trị nil.

Bằng có thể xác minh Tôi có nghĩa là bạn có các kiểm tra/thông số kỹ thuật kiểm tra chế độ xem nào được hiển thị cho các mục nil và item_folders.

0

Tôi cá nhân nghĩ rằng nếu bạn đang kiểm tra số lần xem của bạn (và tôi nghĩ vì khung nhìn là lớp trình bày không chính xác không được kiểm tra ở cấp đó), bạn không muốn kiểm tra trong bộ điều khiển.(Nhưng điều này sẽ không áp dụng cho tất cả các nơi)

Tôi muốn giới thiệu bạn để tạo ra một phương pháp để kiểm tra con số không (để làm cho nó ít DRY) và vượt qua đối tượng của bạn và kiểm tra xem nó là con số không hay không

một cái gì đó như

def is_nil (đối tượng) object.nil? ? '': Đối tượng cuối

và thêm nó vào bộ điều khiển ứng dụng và làm cho nó một helper (để bạn có thể sử dụng nó trong cả hai bộ điều khiển và lượt xem)

(helper_method: is_nil - thêm dòng này vào ứng dụng của bạn điều khiển)

và bây giờ bạn có thể vượt qua đối tượng bạn muốn kiểm tra xem đó có phải là số không hay không.

cổ vũ, Sameera

2

Đừng quên .try, được thêm vào Rails 2.3. Điều này có nghĩa rằng bạn có thể gọi một cái gì đó như sau:

@object.try(:name) 

Và nếu @object là con số không, không có gì sẽ được trả lại. Đây có lẽ là giải pháp tích hợp cho ý tưởng của sameera207.

Lý tưởng nhất, bạn không nên gửi các đối tượng nil đến lượt xem - tuy nhiên không phải lúc nào cũng có thể tránh được.

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