2013-03-14 32 views
5
def confirm_invite_new_tutor 
    redirect_with_msg = false 
    @game_school = GameSchool.find(params[:id]) 
    existing_user_emails = params[:all_emails][:existing_user] || [] 
    new_users = params[:param_game_school][:game_school_invites_attributes] 

if existing_user_emails.present? 
     existing_user_emails.each do |existing_user| 
     // some code 
     end 
     redirect_with_msg = true 
    end 
    if new_users.present? 
     if @game_school.update_attributes(params[:param_game_school]) 
     redirect_with_msg = true 
     else 
     render :invite_tutor_form 
     end 
    end 
    if redirect_with_msg 
     redirect_to @game_school, notice: "daw" 
    else 
     redirect_to @game_school 
    end 
    end 

Nếu tôi thực hiện điều này, tôi đang nhận được lỗi nhưredirect_to và đưa ra với lợi nhuận

Render và/hoặc chuyển hướng được gọi nhiều lần trong hành động này. Xin lưu ý rằng bạn chỉ có thể gọi hiển thị HOẶC chuyển hướng và tối đa một lần cho mỗi hành động. Cũng lưu ý rằng không chuyển hướng cũng không kết xuất thực thi hành động, vì vậy nếu bạn muốn thoát khỏi một hành động sau khi chuyển hướng, bạn cần phải làm một cái gì đó như "redirect_to (...) và trả về".

Nếu tôi sử dụng trả về Đưa tôi đến một trang khác, và thậm chí cả tin nhắn flash không hiển thị. Cách sửa lỗi này?

Trả lời

1

thêm chỉ and return vào cuối mỗi redirect_to hoặc render như dưới đây

`redirect_to @game_school and return` 

này sẽ làm việc cho bạn

+2

còn redirect_to xyz && return thì sao? – Lee

+1

'và' và' && '(lol) có hai ý nghĩa rất khác nhau trong Ruby về quyền ưu tiên (xem http://ruby-doc.org/core-2.3.0/doc/syntax/precedence_rdoc.html). Trong trường hợp này, bạn nên sử dụng 'và'. Đây cũng là một tài nguyên thú vị khác về chủ đề: http://devblog.avdi.org/2014/08/26/how-to-use-rubys-english-andor-operators-without-going-nuts/ – lucke84

8

mọi lúc bạn sử dụng render hoặc redirect trong một bộ điều khiển, không có một phần của mã còn lại nên có kết xuất hoặc chuyển hướng trừ khi nó chắc chắn rằng nó sẽ không được chuyển. sử dụng mã của bạn

if new_users.present? 
    if @game_school.update_attributes(params[:param_game_school]) 
    redirect_with_msg = true 
    else 
    render :invite_tutor_form 
    end 
end 

nếu xác thực không thành công khi bạn cập nhật thuộc tính, bạn đang chạy render :invite_tutor_form. Nhưng mã sẽ tiếp tục chạy phần tiếp theo của mã là

if redirect_with_msg 
    redirect_to @game_school, notice: "daw" 
else 
    redirect_to @game_school 
end 

để bạn nhận được lỗi đó. Giải pháp đơn giản nhất là thêm một return sau khi cuộc gọi đến render

if new_users.present? 
    if @game_school.update_attributes(params[:param_game_school]) 
    redirect_with_msg = true 
    else 
    render :invite_tutor_form 
    return 
    end 
end 

Xin đừng lưu ý rằng khi bạn đang thực hiện xử lý hơn (như cập nhật các thuộc tính khác, hoặc gửi email) sau nếu khối có chứa return, những một phần của mã sẽ không được thực hiện.

+0

Nếu bạn sử dụng 'redirect_to' bạn vẫn cần' return'? – barnett

+1

có, bạn không thể có 2 trong số cả hai trong cùng một hành động. – jvnill

+0

ngoại lệ sẽ là nếu bạn sử dụng 'redirect_to' trong' before_action'. Bạn không cần phải trả lại nếu chuyển hướng của bạn xảy ra trước khi hành động của bạn. – saneshark

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