2015-11-06 4 views
0

Я сейчас практикую, как сделать родословную, я успешно реализовал пользователей, которые владеют собаками, но я хочу, чтобы эти пользователи могли создавать родословные отношения с профилями других собак как в ПОС, связанных с: My viewRails форма, которая требует нескольких параметров из разных моделей

Моя проблема заключается в том, что при нажатии на кнопку Добавить, чтобы создать связь (или по крайней мере знать, если он работает) я получаю «действие„новый“не может быть найдено для PedigreeController» сообщение об ошибке. Вот мой контроллер, и, как вы видите, у меня есть только метод create и destroy. Я попытался изменить URL-адрес в представлении, чтобы создать, но без везения. Я также добавил ресурсы: родословную в файл маршрута.

class PedigreeController < ApplicationController 
    def create 
    @dog = Dog.find(params[:dog_id]) 
    #@pedigree = pedigrees.build(dog_id: @dog.id, relative_id: @dog.id, relation_name: :string) 
    @pedigree = @dog.build_pedigree(pedigree_params) 
    if @pedigree.save 
     flash[:success] = "Dog relative added." 
     redirect_to access_dogmenu_path 
    else 
     flash[:danger] = "Unable to add this dog as relative" 
     redirect_to access_dogmenu_path 
    end 
    end 

    def destroy 
    @pedigree = @dog.pedigrees.find(params[:id]) 
    @pedigree.destroy 
    flash[:success] = "Relative removed." 
    redirect_to access_dogmenu_path 
    end 

    private 

    def pedigree_params 
    params.require(:pedigree).permit(:dog_id, :relative_id, :relation_name) 
    end 
end 

Я создал модель pedigree.rb, которая используется для создания отношений с собаками.

class Pedigree < ActiveRecord::Base 
    belongs_to :dog 
    belongs_to :relative, class_name: Dog 
end 

Это модель dog.rb

class Dog < ActiveRecord::Base 
    belongs_to :user 
    has_many :pedigrees 
    has_many :relatives, through: :pedigrees, dependent: :destroy 
end 

Вот что я в настоящее время, на мой взгляд (который показывает в каждом профиле собаки):

... 
<h3>Relatives: </h3> 
    <ul> 
    <% for pedigree in @dog.pedigrees %> 
    <li> 
    <%= pedigree.relative.dname %>'s - <%= pedigree.relative.relation_name %> 
        <%= link_to "Remove", pedigree, method: :delete %> 
     </li> 
    <% end %> 
    </ul> 
<h4>Add this dog as your dog's relative: </h4> 
    <%= form_for(Pedigree.new, url: new_pedigree_path) do |p| %> 
    Select your dog: 
    <%= p.collection_select(:dog_id, @dogs,:id, :dname, :prompt => "Select your dog") %><br> 
    Select your dog relation to the dog from this profile: 
    <%= select_tag(:relation_id, options_for_select([['Sibling', 1], ['Parent', 2], ['Grandparent', 3], ['Great-grandparent', 4], ['Child', 5], ['Grandchild', 6], ['Great-grandchild', 7]])) %><br> 
<%= p.submit 'Add Relation' %> 
<% end %> 
... 

Для создания родословной отношение 3 необходимо:

  1. Собственная собака собаки user_id (Кажется, что работает collection_select).

  2. Относительный_ид собаки, которая станет относительной, в этом случае relative_id следует брать прямо со страницы показа, например http://localhost:3000/dogs/2 будет отправлять dog_id = 2 в форму. Кто-нибудь знает, как я могу включить это в мою форму?

  3. имя отношения как родственный, родительский и т. Д. Выпадающий селектор, похоже, работает нормально.

Любая помощь очень ценится.

ответ

1

HTML-форма выглядит следующим образом:

<form method="post" action="/some/url"> 
    ... 
    <input type="submit" value="Add Relation" /> 
</form> 

И при нажатии на кнопку Submit, посылается запрос на URL, указанный в атрибуте <form> тега action.

Вы можете установить атрибут действия в:

url: new_pedigree_path 

И, при создании маршрута:

resources :pedigree 

вы получаете следующие хелперы путь:

photos_path returns /photos 
new_photo_path returns /photos/new 
edit_photo_path(:id) returns /photos/:id/edit (for instance, edit_photo_path(10) returns /photos/10/edit) 
photo_path(:id) returns /photos/:id (for instance, photo_path(10) returns /photos/10) 

http://guides.rubyonrails.org/routing.html#path-and-url-helpers

Итак, URL-адрес, который вы задали для атрибута действия: /pedigree/new, который пытается нанести удар по new() действию в PedigreeController.

По умолчанию form_for() создает форму с атрибутом действия, установленным на /pedigree. Смотрите здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

И ваш resources route получает Вас следующие URL к действию отображения:

enter image description here http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

Если вы проверите диаграмму для /pedigree когда часть post запроса - который это тип запроса, который отправляет form_for() (см. полученный html по ссылке выше) - запрос направит на действие create() в PedigreeController.

relative_id собаки, которая станет родственником, ... Знает ли кто-нибудь как бы я идти о включении этого в моей форме?

  1. При создании формы, вы можете создать hidden form field и установите его значение в relative_id. Затем, когда пользователь отправляет форму, пара имя/значение будет в хеше params.

  2. В действии, которое отправляет форму назад, вы можете добавить relative_id в хэш-код sessions, а затем просмотреть его снова, когда пользователь отправит форму.

  3. В действии, которое отправляет форму назад, вы можете установить cookie в ответе: cookies[:name] = value. Затем, когда пользователь отправляет форму, cookie будет отправлен вам обратно в заголовках запроса, и вы можете получить значение из хэша cookies.

+0

Спасибо, что помогли мне понять, какие маршруты сделаны, и способ, которым я могу включить dog_id в мой запрос по почте. – Zero

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