2017-08-16 4 views
0

新しいレールの種類で、私はdeviseを使用していません。私の問題は、自分のパスワードに自分のフォームにpassword_fieldを使用し、subscriber_numberだけを更新すると、パスワードがデータベースで空白になることです。パスワードにtext_fieldを使用すると、実際の値を表示して保存することができます。これは私がやろうとしているものです:Railsパスワードは空白の場合はnilを返します。

class EdiUser < ActiveRecord::Base 

validates_presence_of :subscriber_number 
validates_presence_of :password, :on => :create 

end 

と私のコントローラで:

def update 
      @trader_edi_user = TraderEdiUser.find(params[:id]) 
      @edi_user = EdiUser.find(@trader_edi_user.edi_user_id) 
      #@edi_user.update_attributes(edi_user_params) 

      if params[:edi_user][:password].blank? == true 

       @edi_user.update_attributes(edi_user_subscriber_number) 
      else 
       @edi_user.update_attributes(edi_user_params) 
      end 
     redirect_to :back 
    end 

private 
     def edi_user_params 
      params.require(:edi_user).permit(:id, :subscriber_number, :password, :password_confirmation) 
     end 

     def edi_user_subscriber_number 
      params.require(:edi_user).permit(:subscriber_number) 
     end 

、これが私のフォームです:

<%= form_for(@edi_user, url: {controller: 'maintenance/edi_users', action: 'update'}, html: {class: "form-horizontal", id: "edit_edi"}) do |f| %> 
    <div class="form-group edi subs"> 
     <label class="col-sm-3 control-label has-feedback">Subscriber Number</label> 
     <div class="col-sm-9"> 
      <%= f.text_field :subscriber_number, :class => "form-control req", :required => 'true', :id => "subscriber" %> 
      <br> 
     </div> 
    </div> 
    <div class="form-group edi pass"> 
     <label class="col-sm-3 control-label has-feedback">Password</label> 
     <div class="col-sm-9"> 
      <%#= f.text_field :password, :class => "form-control", :id => "password", :minlength => 6 %> 
      <%= f.password_field :password, :class => "form-control", :id => "password" %> 
      <br> 
     </div> 
    </div> 
    <div class="form-group edi confirm_pass"> 
     <label class="col-sm-3 control-label has-feedback">Confirm Password</label> 
     <div class="col-sm-9"> 
      <%= f.password_field :password_confirmation, :class => "form-control", :id => "confirm_password", data: { :match => "#password"} %> 
      <br> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-sm-12"> 
      <div class="pull-right"> 
       <%= button_tag type: "submit", class: "btn btn-md btn-success raised pull-right", id: "update_btn2" do %> 
        <i class="fa fa-check" aria-hidden="true"></i> <%= t('Button.Update') %> 
       <% end %> 
      </div> 
     </div> 
    </div> 
<% end %> 

は、上の私の更新アクションのための私のコードです私のコントローラが間違っている?私は行方不明の何かがありますか?

は、私はまだセキュリティ上の理由から、工夫のようなものを使用することができ助言する

def update 
    @trader_edi_user = TraderEdiUser.find(params[:id]) 
    @edi_user = EdiUser.find(@trader_edi_user.edi_user_id) 
    edi_user_params.reject! {|k, v| v.blank?} 

    if @edi_user.update_attributes(edi_user_params) 
    # Success 
    else 
    # Error 
    end 
    redirect_to :back 
end 

private 

def edi_user_params 
    params.require(:edi_user).permit(:id, :subscriber_number, :password, :password_confirmation) 
end 

、あなたが空白のparamsを拒否することができ、事前に非常に

+0

だけ確かに.....平文でパスワードを保管していないと教えてください。 –

+0

nope。私はパスワードを保存するためにattr_encryptedを使用しています –

+0

'user_name'はあなたのフォームにもあなたのコードにもありません。どのように更新しますか? –

答えて

0

をお願いします。

+0

このコードの意味は分かりますか? edi_user_params.reject! {| k、v | v == ""} –

+0

ここで説明します:https://apidock.com/ruby/Enumerable/reject – Snake

+0

このエラーが発生しました 未定義のメソッド 'reject! 'なしの場合:NilClass –

0

あなたの質問

redirect_to password_blank_path if edi_user_params[:password].blank? 

をsloveことしかし、ここにコード

それを

を使用する前のparamsを許可

@trader_edi_user = TraderEdiUser.find(params[:id]) 
@edi_user = EdiUser.find(@trader_edi_user.edi_user_id) 
@edi_user.update_attributes(edi_user_params) 

ためのいくつかのアドバイスをしているあなたのメソッドの最初の行に次の行を追加します。 2つのモデル間の関係を使用することの推奨事項

使用find_by代わりに見つけ、原因を見つけるのは何も

# assuming TraderEdiUser belongs_to :edi_user 
@trader_edi_user = TraderEdiUser.find_by(id: edi_user_params[:id]) 
@trader_edi_user.edi_user.update_attributes(edi_user_params) if @trader_edi_user.present? 
0

を発見した場合、私はあなたがこのために探していると思う例外を発生させる可能性があります

このことについてどのように
# edi_user.rb 
validates :password, presence: true, if: :should_validate? 

def should_validate? 
    new_record? # other condition you could put here 
end 

あなたのコントローラについて:

def update 
    @trader_edi_user = TraderEdiUser.find(params[:id]) 
    @edi_user = EdiUser.find(@trader_edi_user.edi_user_id) 
    if @edi_user.update(edi_user_params) 
    redirect_to some_where_path 
    else 
    redirect_to elsewhere_path 
    end 
end 

private 

def edi_user_params 
    params.require(:edi_user).permit(:id, :subscriber_number, :password, :password_confirmation) 
end 
関連する問題