Имя пользователя и аватар Rails 4.1 не сохраняются

Хорошо... У меня очень... очень странная проблема. При создании нового пользователя по какой-то странной причине он не сохраняет имя пользователя или аватар... но только когда они регистрируются по электронной почте. Когда они делают то же самое с Facebook... пользователь и аватар работают нормально. Вот паста из лога:

Parameters: {"utf8"=>"â", "authenticity_token"=>"QDa9azqwenwcyCWPaYWohDDgSRBST3eCRTcagky984=", "user"=>{"ip_address"=>"77.777.77.777", "name"=>"Jim Beam", "email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "avatar"=>#<ActionDispatch::Http::UploadedFile:0x00000008d7a048 @tempfile=#<Tempfile:/tmp/RackMultipart20140827-9443-132d9ai>, @original_filename="joker bench.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user[avatar]\"; filename=\"joker bench.jpg\"\r\nContent-Type: image/jpeg\r\n">}, "commit"=>"Sign up"}
Redirected to http://example.com/
Completed 302 Found in 599ms (ActiveRecord: 216.3ms)
Started GET "/" for 77.185.98.140 at 2014-08-27 14:51:31 +0000
Processing by DailiesController#index as HTML
  Rendered dailies/index.html.erb within layouts/application (21.2ms)
Completed 200 OK in 131ms (Views: 110.7ms | ActiveRecord: 19.6ms)
Started GET "/images/thumb/missing.png" for 77.185.98.140 at 2014-08-27 14:51:31 +0000

ActionController::RoutingError (No route matches [GET] "/images/thumb/missing.png"):

Как видите, имя и изображение принимаются нормально... но потом не сохраняются в базе данных. Их просто нет. Так это звучит как проблема в модели, верно?

class User < ActiveRecord::Base
  has_merit

  acts_as_voter
  acts_as_messageable
  devise :database_authenticatable, :registerable, 
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :provider, :uid, :name, :remember_me, :avatar, :ip_address, :latitude, :longitude, :avatar, :avatar_file_name, :avatar_content_type, :avatar_file_size, :avatar_updated_at, :country, :current_sign_in_ip, :id
 has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
  validates_attachment_content_type :avatar, :content_type => /\Aimage/
def self.from_omniauth(auth)
  where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.ip_address = user.current_sign_in_ip
    user.email = auth.info.email || "#{auth.uid}@facebook.com"
    user.password = user.password_confirmation || SecureRandom.urlsafe_base64(n=6)
    if auth.provider == "facebook"
      user.name = auth.info.name      
      if auth.info.image.present?
        avatar_url = process_uri(auth.info.image)
        user.update_attribute(:avatar, URI.parse(avatar_url))
      end         
    else      
      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
    end
    user.save
  end
end  

Как видите, «:name» является доступным атрибутом, как и «:avatar», и, насколько я знаю, они оба настроены правильно, поскольку они отлично работают для Facebook. Так почему же он не сохраняет их для пользователей электронной почты? Может контроллер прав?

Вот контроллер:

class UsersController < ApplicationController
  before_filter :authenticate_user!
  before_filter :correct_user?, :except => [:index, :show]
  before_filter :ip_address


  def ip_address
 #   @user.ip_address = request.remote_ip
  end

  def index
    @users = User.all
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    @user.ip_address = request.remote_ip
    if @user.update_attributes(params[:user])
      redirect_to @user
    else
      render :edit
    end
  end


  def show
    @user = User.find(params[:id])
    correct_user = @user
  end

end

Не понял... Понятия не имею, в чем может быть проблема. Я, вероятно, разберусь с этим к тому времени, когда кто-нибудь ответит, но я хотел хотя бы спросить. Мы знаем, что форма (я использую Devise) работает нормально, потому что мы видим, что она пытается сохранить имя и аватар в журнале.

В любом случае, дайте мне знать, если вы можете придумать что-нибудь.

РЕДАКТИРОВАТЬ: Выяснил проблему с отсутствующими большими пальцами, но она по-прежнему не работает, когда пользователь пытается загрузить изображение или сохранить имя пользователя. Он сохраняет идентификатор пользователя, адрес электронной почты и пароль... так почему бы ему не сохранить и имя?


person mystic cola    schedule 27.08.2014    source источник


Ответы (1)


В конце концов, не так уж и сложно... Я должен был знать, что:

  1. Если он работает для входа в Facebook (omniauth), но не работает для обычного входа пользователя (devise)
  2. ... тогда это должно быть проблемой разработки.

application_controller.rb

before_action :configure_devise_permitted_parameters, if: :devise_controller?

 protected

  def configure_devise_permitted_parameters
    registration_params = [:name, :ip_address, :avatar, :email, :password, :password_confirmation]

    if params[:action] == 'update'
      devise_parameter_sanitizer.for(:account_update) {
        |u| u.permit(registration_params << :current_password)
      }
    elsif params[:action] == 'create'
      devise_parameter_sanitizer.for(:sign_up) {
        |u| u.permit(registration_params)
      }
    end
  end


end

Итак, все, что мне нужно, это добавить :name, :avatar и :ip_address к разрешенным параметрам для контроллера устройства, и теперь все работает нормально.

person mystic cola    schedule 29.08.2014