【devise】 디폴트 맛없는 flash 메시지에 Bootstrap을 적용 ~ 미해결 수수께끼가 하나 ~

오늘의 수수께끼는 이쪽



요전날 구현한 내용이지만 신규 투고시나 사용자 정보 편집시, 또는 실패시 등에 헤더 아래에 flash 메시지를 표시하고 있다.
각각의 액션이 성공했을 때 or 실패했을 때에 메시지를 바꾸고, 표시의 색도 바꾸는 설정을 컨트롤러에 기술해 잘 되었다.
  • 성공시(색은 dark)
  • 실패시(색은 danger)

  • 결합 테스트 코드로 로그인할 수 있을지 어떨지를 체크하고 있으면 화면에 일순 이상한 flash 메세지가 나타났다.


    Eメールまたはパスワードが違います。이 녀석은 도대체 어디에서 오는지 검색을 하면 에러 메시지를 일본어화하고 있는 파일로부터 불려 가고 있다.
    처음에는 CSS에서 개별적으로 맞을까 생각했지만, alert 그 자체에 걸면 기존에서 걸려 있는 것에도 영향을 버린다는 것을 깨닫고 다른 방법을 찾는 것에.
    그래서 devise의 flash 메시지 그 자체에 Bootstrap을 맞으면 해결하는 것이 아닐까 생각해 조사해 해결했다.

    1·devise의 helper 메소드를 정의



    app/helpers/devise_helper.rb
    
    module DeviseHelper
      def bootstrap_alert(key)
        case key
        when "alert"
          "danger"
        when "notice"
          "dark"
        when "error"
          "danger"
        end
      end
    end
    
    "alert" 는 로그인 성공시 등에 표시"notice" 는 게시 성공시 등에 표시"error"는 오류가 발생했을 때 표시됩니다.
    Bootstrap 의 공식으로 색이 많이 해설되고 있으므로 자세한 것은 그쪽을 봐 주세요.

    2 · views/layouts/_flashes.html.erb 파일 변경



    views/layouts/_flashes.html.erb
    
    <% flash.each do |key, value| %>
      <div class="alert alert-<%= bootstrap_alert(key) %> alert-dismissible fade show">
        <span><%= value %></span>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
    <% end %>
    
    

    이제 변경되었습니다.



    만약을 위해 컨트롤러로 정의하고 있는 쪽도 확인해 보면・・・



    빨갛게 된 것이 하얗게 되어 버렸다! 어째서 야네.
    컨트롤러에는 다음의 설명.

    reviews_controller.rb
      def create
        @review = Review.new(review_params)
        if @review.save
          redirect_to party_path(@review.party), dark: 'レビューの投稿ができました'
        else
          @party = Party.find(params[:party_id])
          @reviews = @party.reviews.includes(:user)
          flash[:danger] = 'レビューの投稿ができませんでした'
          render "parties/show"
        end
      end
    
    app/helpers/devise_helper.rb 로 정의한 안에 dark나 danger가 없기 때문이라고 깨달았다.
    dark나 danger가 되도록, "notice"와 "error"로 재작성하면 좋을까?

    reviews_controller.rb
      def create
        @review = Review.new(review_params)
        if @review.save
          redirect_to party_path(@review.party), notice: 'レビューの投稿ができました'  ⬅️変更
        else
          @party = Party.find(params[:party_id])
          @reviews = @party.reviews.includes(:user)
          flash[:error] = 'レビューの投稿ができませんでした'  ⬅️変更
          render "parties/show"
        end
      end
    

    이것으로 OK!
    이어 edit 액션, update 액션, destroy 액션에도 flash 메시지를 설정했기 때문에 그 쪽도 변경.
    그러면 여기서 문제가 발생.

    edit 액션, destroy 액션 플래시 메시지가 이상합니다.



    reviews_controller.rb
    
      def edit
        unless current_user.id == @review.user_id
          redirect_to root_path, error: '無効なURLです'  ⬅️ここを変更した
        end
      end
    
      def destroy
        @review.destroy
        redirect_to party_path(@review.party), error: 'レビューの削除ができました'  ⬅️ここを変更した
      end
    

    같은 설명 방법으로 하고 있는데 왜 메시지가 표시되지 않는다.
    무엇이 좋지 않을지 잘 모르겠지만, 설명을 변경하면 표시되었다.

    reviews_controller.rb
      def edit
        unless current_user.id == @review.user_id
          redirect_to root_path
          flash[:error] = '無効なURLです'
        end
      end
    
      def destroy
        @review.destroy
        redirect_to party_path(@review.party)
        flash[:error] = 'レビューの削除ができました'
      end
    
    

    오류


    error: 'レビューの削除ができました'

    오 K


    flash[:error] = 'レビューの削除ができました'
    무엇이 다른가?
    flash를 넣지 않으면 읽어 주지 않았다면 create 액션 쪽으로 읽혀지는 것이 이상하다.
    같은 redirect_to 를 사용하고 있고 원인은 다른 곳에 있을지도 모른다.
    우선 이상적인 표시가 되었다.
    원인을 아는 분이 계시면 코멘트 등 받을 수 있으면 다행입니다.

    참고로했습니다.



    @ 후지 모리 치히로
    devise flash 메시지에 bootstrap 경고 적용

    고마워요.

    추가 2/17



    edit 액션도 destroy 액션도 alert: '無効なURLです''이 쓰는 방법으로 갈 수 있었다.
    여러가지 시도했지만, 아무래도 error:가 잘 표시되지 않는 것 같다.
    서버 재부팅 다시 시작하는 초보적인 녀석일까 하고 생각해 보았지만 효과는 없다.error:는 좋지 않지만 alert:는 OK라는 것을 잘 모른다.
    깊어지는 수수께끼.

    reviews_controller.rb
      def edit
        unless current_user.id == @review.user_id
          redirect_to root_path, alert: '無効なURLです'  ⬅️これでOK
        end
      end
    
        def destroy
        @review.destroy
        redirect_to party_path(@review.party), error: 'レビューの削除ができました'  ⬅️error:は表示されない
      end
    
    

    좋은 웹페이지 즐겨찾기