Я пробовал много решений и нашел хорошее, но все равно получаю ошибку. Я редактирую весь свой вопрос.
Я пытаюсь создать дружественный URL-адрес с помощью драгоценного камня friendly_id. В моем проекте Первый пользователь должен зарегистрироваться с помощью devise. Devise передаст некоторую информацию модели профиля с помощью
модель/user.rb
delegate :age, :city, :region, :country, to: :profile
Я хочу, чтобы user.name был кандидатом на Friendly_id. Я пробовал следующий код в моей модели профиля: -
class Profile < ActiveRecord::Base
extend FriendlyId
friendly_id :user_name , use: :slugged
def user_name
user.name
end
Но выдает ошибку
NoMethodError at / undefined метод `имя' для nil: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
А мой profile.rb выглядит так
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
Я думаю, что проблема здесь:
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 !@profile || @profile.user.blocked_users.include?(current_user)
redirect_to home_path
else
@user = @profile.user
end
end
@Rodrigo помог мне найти ошибку, связанную с тем, что Friendly_id не может создать ссылку с экземпляром пользователя.
class Profile < ActiveRecord::Base extend FriendlyId friendly_id u_name , use: :slugged def self.u_name user = User.find(args).name end belongs_to :user accepts_nested_attributes_for :user
Можете ли вы сказать мне, как правильно написать метод u_name? - person Adt   schedule 21.01.2015NameError at / uninitialized constant User::Profile
В начале localhost:3000 - person Rodrigo   schedule 21.01.2015