2016-02-09 87 views
1

我有三種模式User,AnimeAnimelist如何在不同的頁面中提交表單,然後在提交後進行編輯表單

A user能夠將anime添加到他們的animelist。這工作得很好,但我不希望user能夠將無數次相同的anime添加到他們的列表。

我怎麼可以在用戶經過這麼設置它增加了一個動畫自己的列表編輯彈出窗體/按鈕跳出與它們放在信息。

我有一個彈出式窗口中animes /顯示頁面以顯示用戶必須填寫的表單以將動畫添加到其列表中。希望我讓自己清楚。

Animelist _form

<%= simple_form_for [@anime, @animelist] do |f| %> 
    <%= f.input :status %> 
    <%= f.input :rating %> 
    <%= f.input :rewatched %> 
<% end %> 

animes /顯示頁面彈出代碼

<p><a data-open="exampleModal1">Add to Animelist</a></p> 
<div class="reveal form" id="exampleModal1" data-reveal> 
    <%= render partial: 'animelists/form' %> 
    <button class="close-button" data-close aria-label="Close modal" type="button"> 
    <span aria-hidden="true">&times;</span> 
    </button> 
</div> 

Animelist控制器

def new 
    @anime = Anime.friendly.find(params[:anime_id]) 
    @animelist = Animelist.new 
end 
def create 
    @anime = Anime.friendly.find(params[:anime_id]) 
    @animelist = Animelist.new(animelist_params) 
    @animelist.user_id = current_user.id 
    @animelist.anime_id = @anime.id 
    if @animelist.save 
    redirect_to :back 
    else 
    render :new 
    end 
end 

動漫控制器

def show 
    @anime = Anime.friendly.find(params[:id]) 
    @animelist = Animelist.new 
end 

回答

1

你會做到這一點的方法是使用一個validationAnimeList模型以確保每個anime_iduser_id作用域是獨一無二的:

#app/models/anime_list.rb 
class AnimeList < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :anime 

    validates :anime, uniqueness: { scope: :user_id, message: "%{attribute} already added" } 
end 

這將使每一個新AnimeList如果你失敗使用相同的@anime.id & @user.id,您可以在窗體上輸出的錯誤。


結構

有一些問題,你的整體結構,這應該如果你要正確地顯示錯誤加以解決:

#config/initializers/friendly_id.rb 
... 
config.use :finders #-> uncomment so you don't need to call Model.friendly.find any more 

#config/routes.rb 
resources :animes do 
    resources :anime_lists, only: [:create, :destroy], path_names: { create: "add", destroy: "remove" } #-> url.com/animes/:anime_id/add 
end 

#app/controllers/animes_controller.rb 
class AnimesController < ApplicationController 
    def show 
    @anime_list = current_user.anime_lists.new 
    end 
end 

#app/controllers/anime_lists_controller.rb 
class AnimeListsController < ApplicationController 

    def create 
    @anime  = Anime.find params[:anime_id] 
    @animelist = current_user.anime_lists.new animelist_params 
    respond_to do |format| 
     format.js 
    end 
    end 

    def destroy 
    @anime  = Anime.find params[:anime_id] 
    @animelist = current_user.anime_lists.find(params[:id]).destroy 
    end 

    private 

    def animelist_params 
    params.require(:anime_list).permit(:status, :rating, :rewatched).merge(anime_id: @anime.id) 
    end 
end 

這將清理你的控制器,您可以使用:

#app/views/anime_lists/create.js.erb 
$("#anime_list").html("<%=j render partial: \"anime_list/form\", locals: { anime_list: @anime_list } %>"); 

#app/views/anime_lists/_form.html.erb 
<%= simple_form_for anime_list, url: anime_anime_list_path(@anime), remote: true do |f| %> 
    <%= f.input :status %> 
    <%= f.input :rating %> 
    <%= f.input :rewatched %> 
    <%= f.submit %> 
<% end %> 

更新

你的錯誤中提到沒有animelist方法User

enter image description here

這意味着每一個你的要求命中控制器時,它試圖火@user.animelist;由於animelist方法不存在,它正在吐出錯誤。

請記住,JS/Ajax請求只是pseudo請求。每當您使用HTTP時,您的都有向服務器發送請求。該請求然後是處理。你永遠不會在錯誤的黑暗 - 他們將永遠在服務器日誌某處

我就揣問題與CamelCase(或缺乏)做你anime_list協會:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :animelists #-> model name "animelist.rb" 
    has_many :animes, through: :anime_lists 
end 

#app/user/animelist.rb 
class Animelist < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :anime 
end 

在這一方面,我也做了一個小錯誤調用current_user.animelist - 它應該是current_user.anime_lists (複數)。這可能會解決您的問題。

+0

這使得更多的意義。我試圖弄清楚如何在我的動漫/演出頁面中呈現它。我正在考慮做'<%=呈現部分:'animelists/form',當地人:{anime_list:@animelist}%>'但我在chrome控制檯中遇到500(內部服務器錯誤),當我嘗試提交時。是否有另一種方法來呈現部分?我覺得我做錯了 – Wesly

+0

控制檯說什麼,它是否有錯誤信息? –

+0

這是它顯示了我的http:// localhost:3000/animes/kill-la-kill/anime_lists 500(內部服務器錯誤)jquery.self-c64a74367bda6ef8b860f19e74df08927ca99d2be2ac934e9e92d5fd361e0da4.js?body = 1:10244' – Wesly