2016-02-09 2 views
1

У меня есть три модели User, Anime и Animelist.Как отправить форму на другой странице, а затем сделать отображение формы формы после отправки

A user имеет возможность добавить anime к своему animelist. Это работает отлично, но я не хочу, чтобы user мог добавлять в свой список столько же anime.

Как я могу настроить его так, после того, как пользователь добавляет аним в свой список всплывающая формы/кнопка редактирования выскакивает с информацией они положили в.

У меня есть всплывающее окно в animes/show page, чтобы открыть форму, которую пользователь должен заполнить, чтобы добавить аниме в свой список. Надеюсь, я сделаю все возможное.

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

, как вы бы сделать это, чтобы использовать validation на AnimeList модели, чтобы убедиться, каждый anime_id уникален, когда область действия с user_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 %> 

Update

Ваша ошибка упоминает нет 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

Это имеет больший смысл. Я пытаюсь понять, как сделать это на моей странице аниме/шоу. Я думал о том, чтобы сделать '<% = render partial: 'animelists/form', locals: {anime_list: @animelist}%>', но я получаю 500 (Internal Server Error) на консоли хром, когда я пытаюсь отправить. Есть ли другой способ сделать частичный? Я чувствую, что делаю это неправильно – Wesly

+0

Что говорит консоль, есть ли сообщение об ошибке? –

+0

Это то, что он показывает мне: http: // localhost: 3000/animes/kill-la-kill/anime_lists 500 (Внутренняя ошибка сервера) jquery.self-c64a74367bda6ef8b860f19e74df08927ca99d2be2ac934e9e92d5fd361e0da4.js? Body = 1: 10244 ' – Wesly

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