2016-07-07 29 views
1

我有一個頁面,用戶可以輸入電子郵件,如果他們不記得他們的登錄頁面,他們的子域url,但我無法正確設置它。簡單的rails搜索檢查是否存在電子郵件,如果找到,觸發電子郵件發送到輸入的電子郵件

我在公共租客電子郵件表中有一個帳戶表。我收到此錯誤:未定義的局部變量或方法'賬戶」爲#

這裏是我在搜索頁面

find_login.html.erb上:

<div class="form-inputs"> 
    <%= form_tag(find_login_path, :method => "get") do %> 
     <%= text_field_tag :search, params[:search], placeholder: "Email Address", class: "form-control" %> 
     <%= submit_tag "Continue", :name => nil, class: "btn btn-default" %> 
    <% end %> 
    </div> 

accounts_controller.rb:

def find_login 
    @accounts = Account.find_by_email(params[:search].to_s.downcase) 

    unless @accounts.nil? 
     flash[:success] = "Email found! An email has been sent." 
     UserMailer.login_recovery(account).deliver 
     else 
     flash[:error] = "Email NOT found!" if params[:search] && !params[:search].empty? 
    end 
end 

user_mailer.rb:

def login_recovery(account) 
    @account = account 
    mail to: @account.email, subject: 'Your login recocery' 
end 
+1

不是空話,只是設置了標準導軌 - 您應該使用「@帳戶」,因爲您只能通過電子郵件地址找到一個帳戶。 – MageeWorld

回答

2

您將找到的帳戶存儲在實例變量@accounts中,但您將本地變量account傳遞給郵件程序。

只要改變

UserMailer.login_recovery(account).deliver 

UserMailer.login_recovery(@accounts).deliver 

或者作爲方法的重寫:

def find_login 
    query = params[:search].presence 

    if query 
    account = Account.find_by_email(query.downcase) 

    if account 
     UserMailer.login_recovery(account).deliver 
     flash[:success] = "Email found! An email has been sent." 
    else 
     flash[:error] = "Email NOT found!" 
    end 
    end 
end 
+0

如果我沒有弄錯,它應該是'@ accounts'與s,因爲他使用'@accounts = Account.find_by_email('。 –

+0

非常感謝! 我更新了它像你建議的(@account),和下一個問題現在在user_mailer.rb中,錯誤信息「未定義的方法'電子郵件爲nil:NilClass」 'mail to:@ account.email,subject:'Login recovery'' – lilcoder

+0

@lilcoder您應該使用'@賬號'沒有在'find_login'中定義,這就是爲什麼它是'nil'。 –

0

首先,讓我們anlayze此錯誤消息:

error: undefined local variable or method `account' for # 

它說,一個變量account是不確定的,所以讓我們來看看你的方法:

def find_login 
    @accounts = Account.find_by_email(params[:search].to_s.downcase) 

    unless @accounts.nil? 
     flash[:success] = "Email found! An email has been sent." 
     UserMailer.login_recovery(account).deliver 
     else 
     flash[:error] = "Email NOT found!" if params[:search] && !params[:search].empty? 
    end 
end 

在Ruby中,@表示實例變量和普通變量沒有任何特殊的符號。

所以你檢查一個帳戶是否存在@accounts = Account.find_by_email(params[:search].to_s.downcase)。請注意,您正在使用@accounts來存儲查詢結果!

接下來你要做的事情,你檢查是否@accountsnil。目前爲止,一切都很好。您的賬戶,如果找到,將存儲在該變量中。

現在,您撥打login_recovery並以account作爲參數。 account@accounts不同,因爲它是一個普通變量並且名稱不同。這就是錯誤發生的地方。

由於@spickermann在他的回答中表示,使用@accounts

我想補充一步一步的解釋。

+0

感謝您的步驟 - 馬克安德烈的解釋。這有助於瞭解過程。 – lilcoder

相關問題