Rails,简单表单和命名空间资源

时间:2016-10-20 08:00:54

标签: ruby-on-rails ruby namespaces nested

我正在尝试学习如何在我的Rails 5应用程序中使用命名空间文件夹。

我使用简单的表格形式。

我有用户和个人资料的模型。

协会是:

用户

has_one :profile, dependent: :destroy 

资料

belongs_to :user

在我的控制器中,我有app / controllers / users / profiles_controller.rb

那有:

class Users::ProfilesController < ApplicationController

  before_action :set_profile, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!
  after_action :verify_authorized

  def index
    @profiles = Profile.all
    authorize @profiles
  end

  def show
    # debugger
  end

def new
    @profile = Profile.new
    authorize @profile
end

def edit
end

def create
    @profile = Profile.new(profile_params)
    authorize @profile

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

  def update

    # Rails.logger.info "xxxxxxxxxxxxx"
    # Rails.logger.info successful.inspect
    # user=@profile.user
    respond_to do |format|
      if @profile.update(profile_params)
        format.html { redirect_to @profile }
        format.json { render :show, status: :ok, location: @profile }
      else
        format.html { render :edit }
        format.json { render json: @profile.errors, status: :unprocessable_entity }
      end
    end
  end

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


  private
    def set_profile
      @profile = Profile.find(params[:id])
      authorize @profile
    end

    def profile_params
      params.require(:profile).permit( :title, :hero, :avatar, :overview,  :occupation, :external_profile )
    end
end

在我的观点中,我有一个类似的文件夹结构。我有app / views / users / profiles。该文件夹有一个名为_header.html.erb的部分,一个_form.html.erb和一个edit.html.erb

我从users / show.html.erb文件中渲染header.html.erb。这很好。但是,我无法弄清楚如何让编辑个人资料链接起作用。

在我的_header.html.erb部分我有:

 <%= link_to "Update your profile", edit_profile_path(:user, @profile.id) %>

我已经尝试了至少20个这一行的变体 - 但它们都不能用于访问用户/个人资料/编辑视图。

我的佣金路线告诉我:

user_profiles GET      /users/:user_id/profiles(.:format)         users/profiles#index
                                 POST     /users/:user_id/profiles(.:format)         users/profiles#create
                new_user_profile GET      /users/:user_id/profiles/new(.:format)     users/profiles#new
                    edit_profile GET      /profiles/:id/edit(.:format)               users/profiles#edit
                         profile GET      /profiles/:id(.:format)                    users/profiles#show
                                 PATCH    /profiles/:id(.:format)                    users/profiles#update
                                 PUT      /profiles/:id(.:format)                    users/profiles#update
                                 DELETE   /profiles/:id(.:format)                    users/profiles#destroy

在我看来,关键是:

edit_profile GET      /profiles/:id/edit(.:format)               users/profiles#edit

我只是不明白出了什么问题。我认为这应该意味着我可以写:

<%= link_to "Update your profile", edit_profile_path(@profile) %>

这也不起作用。

每个错误都指向我的个人资料表单的第一行,其中包含:

<%= simple_form_for [:user, @profile] do |f| %>

我写了#34;用户&#34;在这一行,因为命名空间的建议是这样做的。

在我的routes.rb文件中,我有:

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

任何人都可以帮助我了解插入它需要什么吗?

0 个答案:

没有答案