2009-05-04 18 views
44

Tôi có một bộ điều khiển có nhiều hành động mất: năm và: tháng là thuộc tính từ URL. Tôi đã thực hiện phương thức riêng là check_date để kiểm tra ngày hợp lệ và kiểm tra ngày không có trong tương lai.Làm cách nào để dừng thực thi bộ điều khiển sau khi sử dụng redirect_to? (Sử dụng Rails)

def check_date(year, month) 
    if month < 1 || month > 12 || year < 2000 
    flash[:notice] = I18n.t 'archive.invalid_date' 
    redirect_to :action => 'index' 
    elsif year > Date.today.year || (year == Date.today.year && month > Date.today.month) 
    flash[:notice] = I18n.t 'archive.no_future' 
    redirect_to :action => 'month_index', 
     :year => Date.today.year, 
     :month => Date.today.month, 
     :type => params[:type] 
    end 
end 

Có cách nào để kết thúc thực hiện điều khiển sau redirect_to không?

cách tôi có thể nghĩ đến là một trong hai để ném một ngoại lệ sau khi redirect_to hoặc để trả về một giá trị từ check_date và kiểm tra xem nó trong mỗi hành động mà các cuộc gọi nó - một cái gì đó giống như

def month_index 
    year = params[:year].to_i 
    month = params[:month].to_i 
    if !check_date(year, month) 
    return 
    ... 
end 

Nhưng tôi tự hỏi, nếu có một số đường ray tốt đẹp để làm điều này. Tôi đã được một nửa hy vọng rằng có được gọi là redirect_to đường ray sẽ nhận ra tôi muốn dừng lại, nhưng điều đó dường như không xảy ra.

Trả lời

35

Bạn có thể muốn sử dụng bộ lọc.

Nếu bạn gọi check_date dưới dạng before_filter trong bộ điều khiển, thực tế là kết xuất hoặc chuyển hướng sẽ ngăn bộ điều khiển gọi phương thức hành động. Nó kết thúc ở đó và sau đó.

+1

Điều này có thể giải quyết được vấn đề của người hỏi nhưng tôi đến đây mong đợi một giải pháp như vrish88's. – iphone007

6

redirect_to chỉ thông báo cho đường ray nội dung hiển thị khi kết thúc. Rails sẽ bị nhầm lẫn nếu bạn thêm render khác hoặc redirect_to chỉ thị sau khi một trong những bạn thực sự muốn, vì vậy chỉ cần trở về từ bộ điều khiển sau khi redirect_to - đó là cách 'bình thường' đường ray để làm việc.

16

Bạn có thể ném vào

return false 

bất cứ nơi nào bạn muốn thực thi mã trong hành động của bạn để ngăn chặn

+4

thực sự, chỉ một sự trở lại sẽ làm. – kch

+3

có nhưng khi nó ở trong một chức năng riêng tư, tôi phải kiểm tra giá trị trả về vì vậy tôi đã tìm kiếm một cách tự động hơn - như before_filter –

+0

@HamishDowner Trong trường hợp đó, tôi chắc chắn sẽ có chức năng riêng trả về trạng thái trong một biểu mẫu gốc với những gì nó đang làm, tức là một biểu tượng nếu nó trả về các ký hiệu khác, một 'false' nếu nó thường trả về' true', một 'nil' nếu nó thường trả về dữ liệu khác, hoặc thậm chí là một dạng biến ngoài hoặc một ngoại lệ nếu điều đó có vẻ tốt nhất cho người trợ giúp. Sau đó, bộ điều khiển nên nhận trên tuy nhiên chức năng riêng tư thể hiện trạng thái tiêu cực, và phản ứng với điều đó.Trộn chức năng của phương thức bộ điều khiển vào một chức năng riêng tư không chỉ bị lộn xộn nhanh, nó cản trở khả năng sử dụng lại. –

47

Bạn cũng có thể làm:

return redirect_to :action => 'index' 

return redirect_to :action => 'month_index', 
    :year => Date.today.year, 
    :month => Date.today.month, 
    :type => params[:type] 

vì nó trông đẹp hơn một trở lại đặt trên dòng riêng của mình (IMHO).

+0

Hoặc 'redirect_to: action => 'index' và trả về' – Rigo

0

Tôi nghĩ OP bị nhầm lẫn về chức năng của redirect_to.

redirect_to sẽ chuyển hướng ở cuối hành động. Tuy nhiên, phần còn lại của hàm điều khiển sẽ thực hiện như bình thường. Tất cả bạn phải làm (như được đăng bởi những người khác) là bao gồm một sự trở lại, như bạn nên gọi bất kỳ chức năng khác.

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