【发布时间】:2017-02-04 02:23:44
【问题描述】:
正在使用 Michael Harti 的 Ruby on Rails Tutorial 并且在关注它时,我在两个模型之间得到了一个未定义的方法。我已重命名模型并尝试使用它进行了很多尝试,但所有尝试都以未定义的方法或未初始化的常量结束。
喊出控制器
class ShoutOutController < ApplicationController
def show
@user = User.find(params[:id])
end
def create
@shout_out = current_user.shout_out.build(shout_out_params)
if @shout_out.save
flash[:success] = "Shout Out Created"
redirect_to root_url
else
render user
end
end
def destroy
end
private
def shout_out_params
params.require(:shout_out).permit(:content)
end
end
用户控制器
class UsersController < ApplicationController
def index
@users = User.paginate(page: params[:page])
end
def new
@user = User.new
end
def show
@user = User.find(params[:id])
@shoutouts = @user.shout_outs.paginate(page: params[:page])
@shoutouts.user = User.find(params[:id]).name
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Welcome!"
redirect_to @user
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
#handles successful update of account info
flash[:success] = "Updated Profile Info"
redirect_to @user
else
render 'edit'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
用户模型
class User < ActiveRecord::Base
attr_accessor :remember_token
# :activation_token
has_many :scrimmages
has_many :ShoutOuts, dependent: :destroy
has_many :friendships
has_many :direct_messages, :through => :friendships
before_save :downcase_email
# before_create :create_activation_digest
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 }, format: {with: VALID_EMAIL_REGEX}, uniqueness: { case_sensitive: false}
has_secure_password
validates :password, presence: true, length: { minimum: 6 }
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
#returns a random token for remember function
def User.new_token
SecureRandom.urlsafe_base64
end
# Remembers a user in the database for use in persistent sessions
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
#returns true if token matches the digest
def authenticated?(remember_token)
return false if remember_digest.nil?
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
#forgets the user
def forget
update_attribute(:remember_digest, nil)
end
private
# converts emails to downcase
def downcase_email
self.email = email.downcase
end
#creates and assigns activation token and digest
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end
end
微博模型
class ShoutOut < ApplicationRecord
belongs_to :user
default_scope -> { order(created_at: :desc)}
validates :user_id, presence: true
validates :content, presence: true, length: {maximum: 140}
end
查看部分
<li id="shoutout-<%= ShoutOut.id %>">
<%= link_to gravatar_for(ShoutOut.user, size: 50), ShoutOut.user %>
<span class="user"><%= link_to ShoutOut.user.name, ShoutOut.user %></span>
<span class="content"><%= ShoutOut.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(shout_out.created_at) %> ago.
</span>
路由文件
Rails.application.routes.draw do
# root to: 'users#new'
# these routes are for showing users a login form, logging them in, and logging them out.
get '/login' => 'sessions#new'
post '/login' => 'sessions#create'
get '/logout' => 'sessions#destroy'
get '/signup' => 'users#new'
post '/users' => 'users#create'
post '/users/id/edit' => 'users#edit'
resources :users
resources :account_activations, only: [:edit]
root to: 'landing#index'
end
【问题讨论】:
-
请发布错误信息。
-
欢迎来到 Stack Overflow!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误和重现它所需的最短代码在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。
标签: ruby-on-rails