2014-02-19 5 views
0

tutorial을 사용하여 레일 응용 프로그램에 대한 선서 객체 지향 접근 방식을 구현했습니다. 또한 사용자 양식을 편집 & 계정 양식으로 분할했습니다.정의되지 않은 메서드 regular_user_path (맹세 개체 지향 접근 방식)

사용자 편집 양식

-Name 
-Username 
-AboutMe 

사용자 계정 양식

-Email 
-Password 
-Password Confirmation 

모든 것은 내가 일반 사용자의 계정이나 프로필을 편집하려고 할 때까지, 괜찮 작동하는 것 같군. 웬일인지 나는이 오류를 계속 알아 듣는다.

undefined method `regular_user_path' for #<#<Class:0x007fc1952f6da0>:0x007fc18bf350a8> 

왜 이런 일이 일어날 지 모르겠습니다. 여기에 내 코드가있다.

모델

class User < ActiveRecord::Base 
    attr_accessible :name, :bio, :avatar, :username 
end 

class RegularUser < User 

    has_secure_password 

    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    VALID_UNAME_REGEX = /^[a-z](\w*[a-z0-9])*$/i 

    validates :name, length: { maximum: 50 } 

    validates :username, :presence => true, 
        :length  => { :maximum => 15 }, 
        :format  => { :with => VALID_UNAME_REGEX }, 
        :uniqueness => { :case_sensitive => false } 

    validates :bio, length: { maximum: 50 } 

end 

컨트롤러

class UsersController < ApplicationController 

    before_filter :signed_in_user, only: [:index, :profile, :update, :destroy, :following, :followers, :account] 
    before_filter :correct_user, only: [:edit, :update, :account] 
    before_filter :admin_user,  only: [:destroy] 

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

    def account 
    @title = "Account" 
    @user = User.find_by_username(params[:id]) 
    end 

    def update 
    @user = RegularUser.find(current_user.id)  ###I think this is causing it 
    if @user.update_attributes(params[:user]) 
     flash[:success] = "Profile updated" 
     sign_in @user 
     redirect_to root_url 
    else 
     if URI(request.referer).path == edit_user_path ###redirects to appropriate page 
     render 'edit' 
     else 
     render 'account' 
     end 
    end 
    end 

def destroy 
    User.find_by_username(params[:id]).destroy 
    flash[:success] = "User destroyed." 
    redirect_to users_url 
end 

private 

    def signed_in_user 
    unless signed_in? 
     store_location 
     redirect_to (root_path), notice: "Please sign in." 
    end 
    end 

    def correct_user 
    @user = User.find_by_username(params[:id]) 
    redirect_to(root_path) unless current_user?(@user) 
    end 

    def admin_user 
    redirect_to(root_path) unless current_user.admin? 
    end 

end 

조회수

Edit View 

<%= form_for @user, :html => { :multipart => true } do |f| %> ###error comes from this line 
    <%= render 'shared/error_messages', object: f.object %> 

    <div class="statictitle">Your Profile</div> 

    <%= f.text_field :username, placeholder: "Username..", :class => "form-control" %> 

    <%= f.text_field :name, placeholder: "Name", :class => "form-control" %> 

    <%= f.text_area :bio, placeholder: "About yourself in 160 characters or less...", class: "textinput" %> 

    <%= f.submit "Update Profile", class: "btn btn-primary" %><br> 

<% end %> 

공유 오류

<% if object.errors.any? %> 
    <div id="error_explanation"> 
    <div class="alert alert-error"> 
     The form contains <%= pluralize(object.errors.count, "error") %>. 
    </div> 
    <ul> 
    <% object.errors.full_messages.each do |msg| %> 
     <li>* <%= msg %></li> 
    <% end %> 
    </ul> 
    </div> 
<% end %> 
def update 
    @user = RegularUser.find(current_user.id)  
    if @user.update_attributes(params[:user]) 
     flash[:success] = "Profile updated" 
     sign_in @user 
     redirect_to root_url 
    else 
     error_messages = @user.errors.messages  ### Capture the error messages 
     @user = User.find_by_username(params[:id]) ### Add this line 
     @user.errors.messages.merge!(error_messages) ### Set the error messages hash 
     if URI(request.referer).path == edit_user_path 
     render 'edit' 
     else 
     render 'account' 
     end 
    end 
    end 

이 업데이트가 실패하면 :개 경로

resources :users do 
    member do 
    get :account 
    end 
end 

LOGS

Started PUT "https://stackoverflow.com/users/ClickOnComics" for 127.0.0.1 at 2014-02-20 17:17:50 -0800 
Processing by UsersController#update as HTML 

Parameters: {"utf8"=>"✓", "authenticity_token"=>"1CUMHhkE10ubS6uuc26fu1yTGn1bABKNqRIJ67EhEO4=", 
"user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", 
"password_confirmation"=>"[FILTERED]"}, "commit"=>"Update Account", "id"=>"ClickOnComics"} 

User Load (0.9ms) SELECT "users".* FROM "users" 
WHERE "users"."remember_token" = 'Wqodv-nd6EhKseqQf9FhqA' LIMIT 1 

User Load (1.1ms) SELECT "users".* FROM "users" 
WHERE "users"."username" = 'ClickOnComics' LIMIT 1 

RegularUser Load (0.5ms) SELECT "users".* FROM "users" 
WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 

(0.2ms) BEGIN 
RegularUser Exists (2.7ms) SELECT 1 AS one FROM "users" WHERE 
(LOWER("users"."username") = LOWER('ClickOnComics') AND "users"."id" != 1) 
LIMIT 1 

RegularUser Exists (2.7ms) SELECT 1 AS one FROM "users" 
WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1 
(0.2ms) ROLLBACK 

CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."username" = 'ClickOnComics' LIMIT 1 
Completed 500 Internal Server Error in 237ms 

NoMethodError (undefined method `errors=' for #<User:0x007fb6fadf87d0>): 
app/controllers/users_controller.rb:40:in `update' 

답변

2

는 아래의 제안 않는 한 @user을로 재설정해야합니다. 그렇지 않으면 User 인스턴스가있는 반면 User 인스턴스가 아닌 RegularUser 인스턴스를 받게됩니다.

+0

실제로 작동하지만 업데이트가 실패 할 때마다 올바른 이유로 페이지가 렌더링됩니다. '사용자 이름을 비워 둘 수 없음'과 같은 오류 알림은 더 이상 표시되지 않습니다. –

+1

@SurgePedroza 업데이트 된 답변을 참조하십시오 –

+0

실제로 여기에 <% = render 'shared/error_messages', object : f.object %>가 있지만 표시되지 않습니다. 좀 이상합니다. 표시하도록 코드를 업데이트했습니다. –

0

시도 당신의 routes.rb 파일에 resources :regular_users을 추가

당신의 update 행동에