2016-01-22 2 views
2

Я использую Devise и Pundit. Чтобы создать новую страницу профиля, пользователь должен получить разрешение на это. Это работает хорошо, так как я впервые реализовал его, но сегодня он просто начал действовать с сообщением об ошибке:Рендеринг и/или перенаправление вызвали несколько раз в действии

Рендер и/или перенаправлять были названы несколько раз в этом действии. Обратите внимание, что вы можете вызывать только рендер или перенаправление, и самое большее один раз за действие. Также обратите внимание, что ни перенаправление, ни рендер не завершают выполнение действия, поэтому, если вы хотите выйти из действия после перенаправления , вам необходимо сделать что-то вроде «redirect_to (...) и return».

Вот мой код из моего контроллера Application:

rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized 
    ... 

    private 

    def user_not_authorized(exception) 
     flash[:alert] = "Sorry, you are not authorized to perform this action." 
     redirect_to(request.referrer || root_path) 
    end 

Вот мой ProfilePage контроллер:

def new 
    @profile_page = ProfilePage.new 
    authorize @profile_page 
end 

def create 
    @profile_page = ProfilePage.new(profile_page_params) 
    respond_to do |format| 
     if @profile_page.save 
     format.html { redirect_to @profile_page, notice: 'Profile page was successfully created.' } 
     format.json { render :show, status: :created, location: @profile_page } 
     else 
     format.html { render :new } 
     format.json { render json: @profile_page.errors, status: :unprocessable_entity } 
     end 
    end 
    authorize @profile_page 
    end 

Кто-то предложил мне добавить эту строку кода ниже flash[:alert]:

self.response_body = nil 

Но теперь мой пользователь снова перенаправляется на страницу «новый профиль», а не на страницу успешного профиля. Он также сообщает пользователю, что они не уполномочены выполнять это действие, несмотря на то, что он разрешил им это делать.

+0

как сообщение об ошибке предлагается, если у вас есть несколько 'render' /' 'redirect_to' за action' вы должны использовать ранний' return', как 'возвратного redirect_to some_path' , Проблема здесь в коде, который вы показываете, я не вижу никакой ошибки. – DevMarwen

+0

Я добавил код из контроллера ProfilePage. Куда бы я отправил раннее возвращение? – rubyandcoffee

+0

Где ошибка? 'new' или' create'' action' – DevMarwen

ответ

2

В действии создания вы должны поставить логику авторизации перед сохранением записи:

Вы должны двигаться

authorize @profile_page 

в верхней части создания действия, после инициализации @profile_page, как и :

def create 
    @profile_page = ProfilePage.new(profile_page_params) 
    authorize @profile_page 

    respond_to do |format| 
     if @profile_page.save 
     format.html { redirect_to @profile_page, notice: 'Profile page was successfully created.' } 
     format.json { render :show, status: :created, location: @profile_page } 
     else 
     format.html { render :new } 
     format.json { render json: @profile_page.errors, status: :unprocessable_entity } 
     end 
    end 
end 
+0

Works! Ах, я, должно быть, переместил его в какой-то момент, не понимая, и поэтому он внезапно прекратил работать. Ура! – rubyandcoffee

 Смежные вопросы

  • Нет связанных вопросов^_^