2016-07-27 35 views
0

該網站的用戶有張圖片,顯示打開一個模式,他們點擊:使用respond_to do | format | format.js顯示一個模式內的消息後照片是在模態內收藏?

照片/ show.html.erb

<%= link_to favorite_photo_path("#{photo.id}"), method: :put do %> 
    <span class="glyphicon glyphicon-heart"></span> 
<% end %> 

的最終目標是讓用戶在模式內,在模式內顯示一條消息,「你已經成功收藏了這張照片」......我在控制器中間測試了這一點,我打電話給respond_to do...但是,當點擊圖形時,模型會更新,但瀏覽器結束up stuck on www.examples.com/photos/1/favorite

路線

resources :photos do 
    match :favorite, on: :member, via: [:put, :delete] 
end 

PhotosController

def favorite 
    @photo = Photo.find params[:id] 
    if request.put? 
    response = current_user.favorite_photos.new(photo: @photo) 
    if !response.valid? 
     redirect_to :back, notice: response.errors.full_messages 
    else 
     response.save 
     respond_to do |format| 
      format.js 
     end 
    end 
    else request.delete? 
     current_user.favorites.delete(@photo) 
     redirect_to :back, notice: 'You successfully unfavorited this photo' 
    end 
    end 

照片/ favorite.js.erb

$('.modal-dialog.photo>.message').html('You have successfully favorited this photo'); 

當HTML:使用{redirect_to的背面},它關閉模態。

+0

你寫了'else request.delete?',你的意思是'elsif request.delete?'? – fbelanger

+0

它改變了代碼嗎? –

+0

就你而言,不......只是因爲你在做'如果request.put?'。 「else request.delete?」語句不會按照您的想法進行評估。要爲if語句添加更多條件,您必須使用'elsif'。 – fbelanger

回答

1

要利用JavaScript響應,您需要將remote: true選項添加到您的鏈接。

http://guides.rubyonrails.org/working_with_javascript_in_rails.html

如果你想通過AJAX來處理這個問題,不要使用重定向回。

同樣使用flash.now作爲AJAX。

而不是在你的JavaScript文件中處理這兩種情況。

# app/views/photos/favorite.js.erb  
<% if flash.now[:notice] %> 
    $('.modal-dialog.photo>.message').html("<%= j flash.now[:notice] %>") 
<% else %> 
    $('.modal-dialog.photo>.message').html("<%= j flash.now[:alert] %>") 
<% end %> 

# app/views/photo/unfavorite.js.erb 
<% if flash.now[:notice] %> 
    $('.modal-dialog.photo>.message').html("<%= j flash.now[:notice] %>") 
<% end %> 

它種去那notice就像是成功和alert是錯誤。

,改變你的控制器這樣的:

def favorite 
    @photo = Photo.find params[:id] 
    favorite_photo = current_user.favorites.build(photo: @photo) 

    if favorite_photo.save 
    flash.now[:notice] = 'You successfully favorited this photo' 
    else 
    flash.now[:alert] = favorite_photo.errors.full_messages 
    end 
    respond_to :js 
end 

def unfavorite 
    @photo = Photo.find params[:id] 
    current_user.favorites.delete(@photo) 
    flash.now[:notice] = 'You successfully unfavorited this photo' 
    respond_to :js 
end 

和你的路線,以匹配該配置。

我想POST收藏夾和DELETE由於每個數據庫的影響而不公平。

目前您只能通過noticealertrenderredirect_to。但是你可以定義你自己的閃存類型。但不要只使用這兩個來約束自己。

if success 
    flash[:success] = "Something good" 
else 
    flash[:error] = "Something bad" 
end 
+0

控制器是什麼樣子,以便js知道是否flash [:notice]?一旦它在控制器中點擊respond_to,js不會觸發並忽略其餘的控制器代碼?我是否需要多次寫回信?現在,當您提醒我關於遠程真的情況後,我只是將所有代碼移至js文件,然後將其餘代碼保留爲html {} –

+0

編輯我的答案! – fbelanger

+0

感謝您的讚賞。 –

相關問題