Rails: неопределенный метод `% 'для true: TrueClass - PullRequest
1 голос
/ 22 июня 2011

У меня проблема с рельсами: я пытаюсь создать приложение для управления паролями для личного использования и для изучения рельсов, и я хочу, чтобы пароли были зашифрованы (сейчас я использую алгоритм blowfish).Я установил crypt gem и написал некоторый код, но я получаю странную ошибку.

Вот мой код:

app / controller / credentials_controller.rb (scaffolded generate)

def create
  @credential = current_user.credentials.build(params[:credential])

  respond_to do |format|
    if @credential.save
      format.html { redirect_to(@credential, :notice => 'Credential was successfully created.') }
      format.xml  { render :xml => @credential, :status => :created, :location => @credential }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @credential.errors, :status => :unprocessable_entity }
    end
  end
end

app / models / credential.rb (в БД я создал столбец salt: string)

require 'crypt/blowfish'                           

 class Credential < ActiveRecord::Base  
    before_save :hash_password
    before_update :hash_password
    after_find :unhash_password

    private
    def hash_password
      self.salt = ActiveSupport::SecureRandom.base64(8)
      blowfish = Crypt::Blowfish.new(self.salt)
      self.pass = blowfish.encrypt_block(self.pass)
    end

    def unhash_password
    end
end

app / views / credential / _form.html.erb

<%= form_for(@credential) do |f| %>
 <% if @credential.errors.any? %>
 <div id="error_explanation">
   <h2><%= pluralize(@credential.errors.count, "error") %> prohibited this credential from being saved:</h2>

   <ul>
   <% @credential.errors.full_messages.each do |msg| %>
     <li><%= msg %></li>
   <% end %>
   </ul >
 </div> 
   <% end %>
 <div class="field">
   <%= f.label :servizio %><br />
   <%= f.text_field :servizio %>
 </div>
 <div class="field">
   <%= f.label :url %><br />
   <%= f.text_field :url %>
 </div>
 <div class="field">
   <%= f.label :email %><br />
   <%= f.text_field :email %>
 </div>
 <div class="field">
   <%= f.label :utente %><br />
   <%= f.text_field :utente %>
 </div>
 <div class="field">
   <%= f.label :pass %><br />
   <%= f.text_field :pass %>
 </div>
 <div class="field">
   <%= f.label :note %><br />
   <%= f.text_area :note %>
 </div>
 <div class="field">

<%= collection_select(:credential, :group_id, current_user.groups, :id, :nome,  prompt => 'Seleziona Gruppo') %>    
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

ошибка:

`Action Controller: Exception caught
NoMethodError in CredentialsController#create 
 undefined method '%' for true:TrueClass
app/models/credential.rb:17:in 'hash_password'
app/controllers/credentials_controller.rb:47
app/controllers/credentials_controller.rb:46:in 'create'

примечание: если в модели учетных данных

def hash_password
    self.salt = ActiveSupport::SecureRandom.base64(8)
    plainBlock = "ABCD1234"
    blowfish = Crypt::Blowfish.new(self.salt)
    self.pass = blowfish.encrypt_block(plainBlock)
  end

это работает, но пароль (очевидно) всегда ABCD1234.приведенный выше код означает, что проблема заключается в self.pass в функции blowfish.encrypt_block.

Что я делаю не так?

Если я пропускаю функцию before_save, она работает как незашифрованный пароль, поэтому я исключаю проблемы, связанные с маршрутами.

большое спасибо!

с наилучшими пожеланиями!

пс: я использую Rails 3.0.8 пс: я слежу за этой страницей http://crypt.rubyforge.org/blowfish.html

1 Ответ

2 голосов
/ 25 июня 2011

У меня есть решение.проблемы были:

self.salt = ActiveSupport::SecureRandom.base64(8)

в этом случае self.salt должен иметь длину 56 байт, потому что для blowfish требуется ключ размером 56 байт.

self.pass = blowfish.encrypt_block(self.pass)

в blofwish, self.pass имеетбыть длиной 8 байт

с наилучшими пожеланиями и спасибо за вашу поддержку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...