2015-01-20 1 views
0

많은 해결책을 시도해 봤지만 좋은 오류가 발생했지만 여전히 오류가 발생합니다. 나는 내 모든 질문을 편집하고있다.NoMethodError at/undefined 메쏘드`name 'for nil : NilClass

friendly_id 보석으로 친숙한 URL을 만들려고합니다. 내 프로젝트 첫 번째 사용자는 devise에 가입해야합니다. 유증 내가 user.name이 Friendly_id 후보가 될 수 있도록 할

delegate :age, :city, :region, :country, to: :profile 

모델/user.rb로 모델을 프로파일 링하는 몇 가지 정보를 전달합니다.

class Profile < ActiveRecord::Base 

     extend FriendlyId 
     friendly_id :user_name , use: :slugged 

     def user_name 
     user.name 
     end 

그러나 무기 호에 대한/ 정의되지 않은 메서드`이름 '에서 오류를

NoMethodError을주고있다 :

NilClass

을 지금 후 - : 내 프로필 모델에서 다음 코드를 시도 사용자 양식 제출.

설명과 함께 가능한 해결책을 제안하십시오.

내 User.rb는

require 'open-uri' 

class User < ActiveRecord::Base 
    paginates_per 10 

    validates :name , presence: true, length: { maximum: 200 } 

    scope :by_name, ->(name) do 
    joins(:profile).where('lower(name) LIKE ?', "%#{name.downcase}%") 
    end 

    delegate :age, :city, :region, :country, to: :profile 

    has_one :profile, dependent: :destroy 
    accepts_nested_attributes_for :profile 


     def self.new_with_session(params, session) 
     session_params = { 'profile_attributes' => {} } 

     provider = session['devise.provider'] 
     if provider && data = session["devise.#{provider}"] 
      session_params['name'] = data[:name] if data[:name] 
      session_params['email'] = data[:email] if data[:email] 
      session_params['profile_attributes'] = 
      { avatar: data[:image] } if data[:image] 
     end 

     params.deep_merge!(session_params) 
     super.tap do |user| 
      if auth = Authorization.find_from_session(session, provider) 
      user.authorizations << auth 
      end 
     end 
     end 

     def password_required? 
     super && registered_manually? 
     end 

     def registered_manually? 
     encrypted_password.present? 
     end 

    end 

처럼 보이는 내가 문제가 여기에있다 생각

class Profile < ActiveRecord::Base 

    extend FriendlyId 
    friendly_id user.name, use: :slugged 


    belongs_to :user 
    accepts_nested_attributes_for :user 


    validates :website, allow_blank: true, uri: true 

    def website=(url_str) 
    if url_str.present? 
     url_str = "http://#{url_str}" unless url_str[/^https?/] 
     write_attribute :website, url_str 
    end 
    end  

end 

처럼 내 profile.rb 보인다 :

Request parameters 
{"action"=>"new", "controller"=>"users/registrations"} 
Please suggest possible solution and explanation. 

그리고 사용자/등록 :

class Users::RegistrationsController < Devise::RegistrationsController 
    layout 'land' 

    def create 
    params[:user][:profile_attributes].delete(:place) 

    end 
    protected 

    def after_sign_up_path_for(resource) 
     welcome_path 
    end 
end 
,

내가 프로필 컨트롤러

def load_profile 
     @profile = Profile.friendly.find(params[:id]) 
     if [email protected] || @profile.user.blocked_users.include?(current_user) 
     redirect_to home_path 
     else 
     @user = @profile.user 
     end 
    end 

에서 사용자를 생성하고 @Rodrigo 내가 그 오류가 사용자 인스턴스에 링크를 만들 수 없습니다 Friendly_id로 인한 오류를 찾을 수있었습니다.

friendly_id user.name, use: :slugged 

변수 사용자가 Profile 클래스 범위에 존재하지 않습니다

+0

다른 문제로 질문을 편집했습니다. 첫 번째 문제가 해결 되었습니까? – Rodrigo

+0

@Rodrigo 문제의 원인을 발견했습니다. 내 사용자 모델은 프로필의 인스턴스를 생성합니다. 나는 사용자 컨트롤러에 의해 생성 된 '사용자'의 값에 액세스하려고 시도하고 컨트롤러가 만들 수 있기 전에 해당 값에 액세스하려고합니다. 그게 문제가되는 이유. – Adt

+0

@Rodrigo 내가 '클래스 프로파일에 의해 '사용자'를 만들기 위해 노력하고 <액티브 :: 자료 이 FriendlyId friendly_id u_name 사용을 확장 : 데프 사용자 = User.find (인수를) self.u_name 장타율 을 .NAME end belongs_to : 사용자 accepts_nested_attributes_for : 사용자 ' u_name 메서드를 작성하는 올바른 방법을 알려주시겠습니까? – Adt

답변

2

는이 라인에 오류가 있습니다.

friendly_id :user_name, use: :slugged 

def user_name 
    user.name 
end 
+0

나는 또한 노력하지 않았다. – Adt

1
extend FriendlyId 
    friendly_id u_name, use: :slugged 
    def u_name 
     user.name 
    end 
    belongs_to :user 

당신이 사용자 정의 :이 같은 것을 사용 하는가? user.name은 무엇입니까?

관련 문제