2016-10-20 3 views
0

Я пытаюсь (и не очень далеко) понять, как использовать папки с именами в моем приложении Rails 5.Rails 5 - папки с именами

У меня есть таблицы в моей схеме для пользователей, тождеств и настроек.

Ассоциации являются:

Пользователь

has_many :identities, dependent: :destroy 
has_one :setting, dependent: :destroy 

Установка

belongs_to :user 

Удостоверение

belongs_to :user 

Я организовал мои папки контроллера, так что у меня есть приложение/контроллер s/пользователи/identities_controller.rb и приложение/контроллеры/пользователи/settings_controller.rb

Каждые из этих контроллеров имеют первую строку:

class Users::SettingsController < ApplicationController 
class Users::IdentitiesController < ApplicationController 

Я организовал мои взгляды папку подобным образом.

У меня есть приложение/views/users/settings/show.

У меня нет представлений для тождеств, кроме частичного имени _authentications.html.erb. В настоящее время он хранится в папке app/views/users. Я пытаюсь переместить его в папку app/views/users/settings и отобразить его на странице приложения/просмотров/пользователей/настроек/показа.

В моих маршрутах файл у меня есть:

resources :users, shallow: true do 
    scope module: :users do 
     resources :assign_roles 
     resources :identities 
     resources :profiles 
     resources :settings 
    end 

Когда я оказывать частичные аутентификации из приложения/просмотров/пользователей показать страницу, у меня нет никаких ошибок. Все работает. Я застрял, потому что есть что-то, что я не понимаю & Я не знаю, что это такое.

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

Когда я пытаюсь сделать это, я получаю сообщение об ошибке, которое говорит:

undefined method `identities' for nil:NilClass 

что ссылки ошибок этот блок из моих авторизаций парциальное:

<% if @user.identities.map(&:provider).include?('linkedin') %> 
    <span class="glyphicon glyphicon-ok"></span> 
<% else %> 
    <%= link_to 'Connect your Linkedin account', user_linkedin_omniauth_authorize_path %> 
<% end %> 

Я не понимаю ли я» m должен попытаться добавить настройки в этом случае, если так или иначе? Я попытался, если @ setting.user.identities (только как догадка), но это не сработало.

Может ли кто-нибудь увидеть, что я делаю неправильно? Я не могу найти простое английское объяснение того, как начать работу с вложением и пространством имен.

Добавить настройки контроллера

class Users::SettingsController < ApplicationController 
    before_action :set_setting, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! 
    after_action :verify_authorized 

    def index 
    @settings = Setting.all 
    authorize @settings 
    end 

    def show 
    # authorize @setting 
    end 


    def new 
    @setting = Setting.new 
    authorize @setting 

    end 

    def edit 
    end 

    def create 
    @setting = Setting.new(setting_params) 
    authorize @setting 

    respond_to do |format| 
     if @setting.save 
     format.html { redirect_to @setting } 
     format.json { render :show, status: :created, location: @setting } 
     else 
     format.html { render :new } 
     format.json { render json: @setting.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @setting.update(setting_params) 
     format.html { redirect_to @setting } 
     format.json { render :show, status: :ok, location: @setting } 
     else 
     format.html { render :edit } 
     format.json { render json: @setting.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @setting.destroy 
    respond_to do |format| 
     format.html { redirect_to settings_url } 
     format.json { head :no_content } 
    end 
    end 


    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_setting 
     @setting = Setting.find(params[:id]) 
     authorize @setting 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def setting_params 
     params.require(:setting).permit(:newsletter) 
    end 

end 
+0

Сообщение об ошибке, похоже, указывает, что @user равно нулю в вашем частичном. Можете ли вы поделиться соответствующим кодом действия контроллера? – omnikron

+0

@omnikron - какой частичный вы имеете в виду? Если я выношу _authentications.html.erb, когда он сохраняется как файл под представлениями/пользователями и рендерит в users/show - все работает. Вещь, которую я пытаюсь изменить, заключается в том, что я перемещаю частичную аутентификацию, чтобы сохранить ее в папке views/users/settings и отобразить ее в представлении/users/settings/show.html.erb. Какой контроллер имеет отношение к этому сценарию? – Mel

+0

Этот контроллер, действие которого оказывает частичное. Мое предположение - контроллер настроек. – Sajan

ответ

0

Там нет @user переменного существа устанавливаются в ваших show действий, поэтому вы получаете что NoMethodError undefined method 'identities' for nil:NilClass ошибки. @user возвращает nil в свои частичные. Вы можете установить это в контроллере с помощью @user = current_user (при условии, что вы используете программу) или заменить @user на current_user в частичном.

Сказав все это - есть ли какая-то особая причина, по которой вы хотите пропустить все ваши контроллеры, как это? Просто потому, что вы установили связь has_many или has_one между вашими моделями не обязательно означает, что вам также необходимо пространство имен для ваших контроллеров. Если у вас есть все основания для этого, тогда хорошо; если нет, то вы можете рассмотреть возможность переноса контроллеров из пространства имен пользователей.

+0

Большое спасибо. Причина, по которой я хочу пространство имен, это то, что я пробовал его со всем на верхнем уровне, и он становится очень грязным, когда нет какой-либо организации папок. Большое спасибо за объяснение. – Mel

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