2014-10-10 5 views
0

Я видел функцию в приложении, которую я хотел бы реализовать. Приложение имеет несколько ресурсов - фотографии, статьи и т. Д. В навигационной панели рядом с вкладками фотографий и статей были две кнопки - организационная и личная. Когда один клик на кнопку организации, если они затем нажимают на фотографии или статьи, они получают список всех фотографий и статей, принадлежащих членам их организации. Если они нажали на личную кнопку, и после этого они нажимают на фотографии или статьи, они получают списки только своих личных фотографий и статей, опуская ресурсы, принадлежащие другим членам их организации. Поэтому мне интересно, как это состояние сохраняется между запросами.Как иметь условные виды в Rails?

Я полагаю, что одним из способов было бы постоянно передавать переменную между представлениями и контроллером и на основе этой переменной перечислять определенный ресурс. Или, может быть, сохранить состояние в сеансе (хотя я полагаю, что это должно быть сделано в крайнем случае). Другой способ - использовать декоратор, такой как draper, но я немного смущен об особенностях его реализации. Я был бы очень благодарен, если кто-то укажет мне на статью или на учебное пособие, в котором показано, как реализовать такую ​​функцию или просто дается обзор шагов.

Чтобы быть ясным, еще раз: есть ссылки для индексации разных ресурсов, но на основе параметра действие индекса соответствующего контроллера возвращает разные результаты. Что-то вроде:

def index 
    if params[:type] == 'organization' 
    @photos = Organization.find_by(id: params[:organization][:id]).photos 
    else 
    @photos = User.find_by(id: params[:user][:id]).photos 
    end 
end 

Вопрос - как я могу передать параметр type - жесткий код его в помощниках пути и имеют разные взгляды с различными значениями для этого параметра или есть способ лучше?

Это отношение моих моделей:


class User < ActiveRecord::Base 

    belongs_to :organization, 
    inverse_of: :members 

    has_many :photos, 
    inverse_of: :owner, 
    foreign_key: :owner_id, 
    dependent: :destroy 

    ... 
end 

class Photo < ActiveRecord::Base 

    belongs_to :owner, 
    class_name: User, 
    inverse_of: :photos 

    belongs_to :organization, 
    inverse_of: :photos 

    ... 
end 

class Organization < ActiveRecord::Base 

    has_many :members, 
    class_name: User, 
    inverse_of: :organization, 
    dependent: :destroy 
    has_many :photos, 
    inverse_of: :organization, 
    dependent: :destroy 

    ... 
end 

ответ

0

она может быть решена на много различных способов, но, например, если я понял, вы, один из них, что ресурсы фото, статьи и т. д. имеют одно поле, которое может быть «органическим» zation 'или' personal '. После этого, нажав на это в приложении, вы можете фильтровать ресурсы (статьи, фотографии, ...) этим полем.

Все зависит от ситуации, может быть, другим решением будет создание полностью разделенного модуля, в котором вы собираетесь хранить такие вещи, как организация, личные и т. Д. Это лучше, если вы хотите продлить последнее, что и рядом с организацией и персоналом добавить что-то еще.

Как я уже сказал, все зависит от ситуации и проекта.

дополнительно:

нормально, из вашего примера, я могу видеть, что, нажав на, например, ссылку на пользователя, вы будете иметь идентификатор пользователя. Таким образом, вы можете легко показать все фотографии этого пользователя:

# params[id] - user id which is got by clicking 

user = User.find(params[id]) 
@photos = user.photos 
+0

Вещь - это фотография, принадлежащая как пользователю, так и организации, Пользователь принадлежит Организации, а Организация имеет множество пользователей и фотографий. –

+0

не могли бы вы представить, как выглядят ваши модели (часть кода организации, пользователь, фотография, статья) –

+0

Конечно, я редактировал мой вопрос. –

1

, перезагружая страницу с URL-параметров

У меня была аналогичная проблема, и есть несколько различных способов передачи параметров в зависимости от того, что хотеть. Я на самом деле просто пошел с передачей их через URL.Если вы добавите ?type=organization к своему URL-адресу, вы получите дополнительную пару «ключ-значение» в ваших параметрах, 'type' => 'organization', и вы можете просто использовать это. Если вы хотите перейти по этому URL-адресу по ссылке, вы можете просто сделать link_to photos_path + "?type=organization". Я закончил тем, что использовал javascript, так как хотел чего-то другого, кроме ссылки. Независимо от вашего html-элемента, дайте ему атрибут onclick=changeParam(), а затем определите эту функцию в своем javascript.

function changeParam() { 
    window.location.search = "?type=organization" 
} 

Это автоматически перезагрузит страницу с этим параметром. Если вы хотите больше одного, добавьте &param2=value2 к тому, что у вас есть.

через AJAX

Вы также можете использовать AJAX для передачи параметров, если вы не хотите, полное обновление страницы. Если вы знаете, как использовать AJAX уже, просто используйте опцию данных:

$.ajax({ 
     type: "GET", 
     url: "/photos", 
     data: { type : organization, param2 : value2 } 
}) 

В этом случае ваша PARAMS посылается, хотя данные. Если вы хотите узнать больше об AJAX и как это использовать, сообщите мне, и я уточню свой ответ с более подробной информацией. В Rails это довольно запутанно, и нет хорошей документации, поэтому я добавлю то, что знаю, если вы захотите.

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