如果空白,Rails密码返回nil

时间:2017-08-16 07:30:20

标签: ruby-on-rails ruby

我是铁杆的新手,我没有使用设计。我的问题是,当我在我的表单中使用password_field作为我的密码而我只更新subscriber_number时,密码在我的数据库中变为空白。但是当我使用text_field作为我的密码时,可以看到并保存实际值。这就是我想要做的事情:

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 %>

我的控制器上的更新操作的代码错了吗?还是有什么我想念的?

非常感谢你

3 个答案:

答案 0 :(得分:0)

你可以拒绝空白参数,

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

出于安全原因,我仍然建议您使用Devise之类的东西。

答案 1 :(得分:0)

在方法的第一行添加以下行可能会解决您的问题

redirect_to password_blank_path if edi_user_params[:password].blank?

但是,这里有一些针对您的代码的建议

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

在使用之前允许使用params

建议使用两个模型之间的关系

使用find_by而不是find,如果找不到任何内容,则导致查找可能引发异常

# 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?

答案 2 :(得分: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