1

私は、permission.rb にあるこの構文エラーを解決できません。追加の「終了」が必要であると表示されていますが、追加すると、Safari はページを読み込めません。両方のファイルでいくつかの異なる方法を試しましたが、どれもうまくいかないようです。何か案は?

エラー:

    SyntaxError in UsersController#new

/Users/lexi87/dating/app/controllers/application_controller.rb:20: syntax error, unexpected keyword_end, expecting end-of-input
Rails.root: /Users/lexi87/dating

Application Trace | Framework Trace | Full Trace
app/controllers/users_controller.rb:1:in `<top (required)>'

permission.rb (余分な 'end' なし):

class Permission < Struct.new(:user)
  def allow?(controller, action)
    if user.nil?
      controller == "galleries" && action.in?(%w[index show])
    elsif user.admin?
      true
    else
      controller == "galleries" && action != "destroy"
    end
  end

アプリケーションコントローラー:

class ApplicationController < ActionController::Base
  protect_from_forgery

private

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  helper_method :current_user

  def current_permission
    @current_permission || ::Permission.new(current_user)
  end
end
  def authorize
    if !current_permission.allow?(params[:controller], params[:action])
      redirect_to root_url, alert: "Not authorized."
    end
  end
end

アップデート

Here's my users_controller:

class UsersController < ApplicationController
  before_filter :authorize

  def new
    @user = User.new
  end

  def profile
    @profile = User.profile
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      UserMailer.registration_confirmation(@user).deliver
      session[:user_id] = @user.id
      redirect_to root_url, notice: "Thank you for signing up!"
    else
      render "new"
    end
  end

  def show
    @user = User.find(params[:id])
  end

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

  def index
    @users = User.all
  end

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

def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      flash[:success] = "Account updated"
      redirect_to @user
      authorize! :update, @user
    else
      render 'edit'
    end
end
end
4

3 に答える 3

1

endpermission.rbもう1 つ必要なようで、application_controller.rb に移動する必要があります。

class ApplicationController < ActionController::Base
  protect_from_forgery

private

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  helper_method :current_user

  def current_permission
    @current_permission || ::Permission.new(current_user)
  end
end  # this shouldn't be here
  def authorize
    if !current_permission.allow?(params[:controller], params[:action])
      redirect_to root_url, alert: "Not authorized."
    end
  end
# it should be here
于 2013-03-14T16:12:58.290 に答える
0

privateキーワードを閉じる必要はありません。

endその後_

def current_permission

必要ありません!

于 2013-03-14T16:13:17.613 に答える
0

修正

1.

endの最後にが必ず必要です。permission.rb

2.

のプライベートセクションをエンドツーエンドにする必要はありませんApplicationController。private キーワードの下にあるものはすべて「プライベート」と見なされます。したがって、「承認」メソッドを移動する必要があります。

解決

したがって、完全なコードは次のとおりです(1つのメソッドを「パブリック」に移動):

許可.rb:

class Permission < Struct.new(:user)
  def allow?(controller, action)
    if user.nil?
      controller == "galleries" && action.in?(%w[index show])
    elsif user.admin?
      true
    else
      controller == "galleries" && action != "destroy"
    end
  end
end

アプリケーションコントローラー:

class ApplicationController < ActionController::Base
  protect_from_forgery

  def authorize
    if !current_permission.allow?(params[:controller], params[:action])
      redirect_to root_url, alert: "Not authorized."
    end
  end

private

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  helper_method :current_user

  def current_permission
    @current_permission || ::Permission.new(current_user)
  end

end
于 2013-03-14T16:14:58.037 に答える