簡體   English   中英

使check_box在Rails表單中工作

[英]Getting check_box to work in a Rails form

我的目標是使用登錄表單上的復選框,以允許用戶選擇在瀏覽器關閉后保持登錄狀態。 我在登錄表單的復選框中使用了以下代碼(視圖>會話> new.html.erb):

<div class="field">
  <%= f.check_box :stay_signed_in %> Stay signed in?
</div>

因此::stay_signed_in如果為1,則為1,否則為0。 然后,我(嘗試)根據:stay_signed_in的值(在會話控制器中)將會話變量:staysignedin設置為true或false:

def create
  session[:staysignedin] = (params[:session][:stay_signed_in] == "1") ? true : false
  ...
end

此代碼有問題。 即使選中此框,並且:stay_signed_in絕對為1,session [:staysignedin]也永遠不會設置為true。 我要去哪里錯了?

編輯:登錄表單的其余部分如下所示:

<%= form_for(:session, :url => sessions_path) do |f| %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>

  <div class="field">
    <%= f.label :password %><br />
    <%= f.password_field :password %>
  </div>

  <div class="field">
    <%= f.check_box :stay_signed_in %>
    Stay signed in on this computer?
  </div>

  <div class="actions">
    <%= f.submit "Sign in" %>
  </div>

<% end %>

編輯:糾正:它正在將session [:staysignedin]正確設置為true或false,因此故障必須在其他位置。 問題在於,選中“保持登錄狀態”后,當我關閉瀏覽器並重新打開瀏覽器時,用戶仍未登錄。當我刪除“保持登錄狀態嗎?” 登錄表單上的復選框和所有相關代碼,僅保留永久登錄代碼,即可正常工作。

def sign_in(user)
  if session[:staysignedin]
    cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  else
    session[:userid] = user.id
  end
  self.current_user = user
end

def sign_out
  if session[:staysignedin]
    cookies.delete(:remember_token)
  else
    session[:userid] = nil
    session[:staysignedin] = nil
  end
  self.current_user = nil
end

其余的表單代碼是什么樣的?

我的猜測是:stay_signed_in不是存儲到params[:session][:stay_signed_in] ,而是params[:something_else][:stay_signed_in]或只是params[:stay_signed_in]

如果您在本地WEBrick上運行,則可以看到每個請求發布的參數,這將有助於確保您具有正確的參數密鑰。

-編輯-

根據您的最新評論,我建議您使用Devise處理身份驗證邏輯。 它實現起來非常容易,與Rails 3完全兼容,並且包括用於處理會話和記住保持登錄狀態的內置代碼。

當有一個如此好的插件可用時,例如輕量級的,堅如磐石的,有據可查的等等,在一個簡單的會話記憶問題上停留這么長時間可能不值得您花時間。

有關介紹,請參閱此Railscast

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM