Пространство имен маршрутизации рельсов кошмар - PullRequest
0 голосов
/ 20 марта 2011

Я все еще изучаю Rails 3, но маршруты сводят меня с ума.Я пытаюсь использовать пространство имен для разделения административного раздела сайта.Проблема в том, что некоторые вещи в пространстве имен просто не работают, а также направляются в неправильное место.Например, используя рельсы, сгенерированные маршруты, указав ресурс, представление указывает на неправильный маршрут при передаче объекта, поэтому форма редактирования не будет работать.

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

namespace :admin do
  resources :users
end


admin_users GET        /admin/users(.:format)          {:action=>"index", :controller=>"admin/users"}
                POST   /admin/users(.:format)          {:action=>"create", :controller=>"admin/users"}
 new_admin_user GET    /admin/users/new(.:format)      {:action=>"new", :controller=>"admin/users"}
edit_admin_user GET    /admin/users/:id/edit(.:format) {:action=>"edit", :controller=>"admin/users"}
     admin_user PUT    /admin/users/:id(.:format)      {:action=>"update", :controller=>"admin/users"}
                DELETE /admin/users/:id(.:format)      {:action=>"destroy", :controller=>"admin/users"}

Контроллер:

class Admin::UsersController < ApplicationController

  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def edit
    @user = User.find(params[:id])
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      redirect_to(@user, :notice => 'User was successfully created.')
    else
      render :action => "new"
    end
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      redirect_to(admin_users_path, :notice => 'User was successfully updated.')
    else
      render :action => "edit"
    end
  end

  def destroy
    @user = User.find(params[:id])
    @user.destroy
    redirect_to(admin_users_path)
  end
end

Пример представления: index.html.erb, в котором перечислены все пользователи

<h1>Listing users</h1>

<table>
<% for user in @users %>
  <tr>
    <td><%= user.id %></td>
    <td><%= user.username %></td>
    <td><%= user.email %></td>
    <td><%= link_to 'Show', @user %></td>
    <td><%= link_to 'Edit', edit_admin_user_path(user) %></td>
    <td><%= link_to 'Destroy', admin_user_path, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New User',  new_admin_user_path %>

Использование представления редактирования также имеет проблему.Форма редактирования должна указывать маршрут обновления, но не указывает.Вместо этого он указывает на маршрут редактирования (в основном сам), когда передается только объект User.Из того, что я читал, использование объекта в формах является рекомендуемым способом, но это не может быть хорошо, если он не работает.

Я получаю эту ошибку при выводе списка всех пользователей.

No route matches {:action=>"update", :controller=>"admin/users"}

Extracted source (around line #17):
17:     <td><%= link_to 'Destroy', admin_user_path, :confirm => 'Are you sure?', :method => :delete %></td>

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

Спасибо, Онит

Ответы [ 2 ]

5 голосов
/ 20 марта 2011

Вам не хватает идентификатора в ссылке для удаления

Попробуйте с

<td><%= link_to 'Destroy', admin_user_path(user), :confirm => 'Are you sure?', :method => :delete %></td>

(изменено admin_user_path на admin_user_path (пользователь) как ссылка)

2 голосов
/ 14 мая 2011

Если вы выполните маршруты рейка , вы увидите что-то вроде этого:

    admin_users GET    /admin/users(.:format)            {:controller=>"admin/users", :action=>"index"}
                      POST   /admin/users(.:format)            {:controller=>"admin/users", :action=>"create"}
       new_admin_user GET    /admin/users/new(.:format)        {:controller=>"admin/users", :action=>"new"}
      edit_admin_user GET    /admin/users/:id/edit(.:format)   {:controller=>"admin/users", :action=>"edit"}
           admin_user GET    /admin/users/:id(.:format)        {:controller=>"admin/users", :action=>"show"}
                      PUT    /admin/users/:id(.:format)        {:controller=>"admin/users", :action=>"update"}
                      DELETE /admin/users/:id(.:format)        {:controller=>"admin/users", :action=>"destroy"}
          admin_pages GET    /admin/pages(.:format)            {:controller=>"admin/pages", :action=>"index"}
                      POST   /admin/pages(.:format)            {:controller=>"admin/pages", :action=>"create"}
       new_admin_page GET    /admin/pages/new(.:format)        {:controller=>"admin/pages", :action=>"new"}
      edit_admin_page GET    /admin/pages/:id/edit(.:format)   {:controller=>"admin/pages", :action=>"edit"}
           admin_page GET    /admin/pages/:id(.:format)        {:controller=>"admin/pages", :action=>"show"}
                      PUT    /admin/pages/:id(.:format)        {:controller=>"admin/pages", :action=>"update"}
                      DELETE /admin/pages/:id(.:format)        {:controller=>"admin/pages", :action=>"destroy"}

Таким образом, вы можете получить

admin_user_path

, который будет таким же, как

user_path

Затем вы должны передать @user в admin_user_path следующим образом:

admin_user_path(@user)

Затем метод: должен вызывать метод destroy вместо автоматического перехода к методу show!:)

Чтобы заставить форму работать, я нашел следующий ресурс: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

В разделе form_for они объясняют маршрутизацию пространства имен с помощью form_for как:

    For namespaced routes, like admin_post_url:

    <%= form_for([:admin, @post]) do |f| %>
     ...
    <% end %>

Для получения информации относительно маршрутов рейка проверьте: http://guides.rubyonrails.org/command_line.html#rake-is-ruby-make затем в разделе 2.4.9 Разные задачи они объясняют rake --tasks показывает различные команды рейка, которые вы можете использоватьи Рейк-маршруты показывает доступные вам маршруты.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...