이 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'
실제로 작동하지만 업데이트가 실패 할 때마다 올바른 이유로 페이지가 렌더링됩니다. '사용자 이름을 비워 둘 수 없음'과 같은 오류 알림은 더 이상 표시되지 않습니다. –
@SurgePedroza 업데이트 된 답변을 참조하십시오 –
실제로 여기에 <% = render 'shared/error_messages', object : f.object %>가 있지만 표시되지 않습니다. 좀 이상합니다. 표시하도록 코드를 업데이트했습니다. –