Проблема с установкой параметра ': controller' для оператора 'link_to' - PullRequest
1 голос
/ 29 июля 2011

Я использую Ruby on Rails 3.0.9, и я хотел бы знать, почему я получаю ошибку, описанную ниже, и как я могу ее решить.

В моем /views/articles/categories/_content.html.erb файле у меня есть:

...
<%= link_to("New article", {:controller => content[:article_controller], :action => 'new'}) %>
...

Если я установлю content[:article_controller] (обе настройки true и false для опции :only_path)

 1. content[:article_controller] = 'articles'
 2. content[:article_controller] = '/articles'
 3. content[:article_controller] = '/articles/'
 4. content[:article_controller] = '/'
 4. content[:article_controller] = ''

Я получаю соответственно следующие ошибки (примечание :controller значения):

 1. `ActionView::Template::Error (No route matches {:controller=>"articles/categories/articles", :action=>"new"})`
 2. `ActionView::Template::Error (No route matches {:controller=>"articles//articles", :action=>"new"})`
 3. `ActionView::Template::Error (No route matches {:controller=>"articles/", :action=>"new"})`
 4. `ActionView::Template::Error (No route matches {:controller=>"articles//", :action=>"new"})`
 4. `ActionView::Template::Error (No route matches {:controller=>"articles/categories/", :action=>"new"})`

Это ошибка Ruby on Rails или это моя ошибка? В чем проблема и как я могу решить, как заставить link_to нормально работать?

Однако я могу решить эту проблему с помощью:

<%= link_to("New article", {:controller => '../', :action => 'new'}) %>

Но почему он работает с '.../', а не другими способами?


Я заметил, что некоторое время путь к контроллеру, для которого я пытаюсь установить content[:article_contr8oller], кажется, полагается на "базовый" текущий путь к контроллеру, который обрабатывает файл представления (файл контроллера - app/controllers/articles/categories/concerns_controller.rb - читайте ниже для больше информации) ... почему это происходит?

Это также происходит с использованием url_for:

url_for(:controller => 'articles', :action => 'new')

Запустив команду rake routes, я получаю следующее:

   articles_categories GET    /articles/categories(.:format)          {:action=>"index", :controller=>"articles/categories"}
                       POST   /articles/categories(.:format)          {:action=>"create", :controller=>"articles/categories"}
 new_articles_category GET    /articles/categories/new(.:format)      {:action=>"new", :controller=>"articles/categories"}
edit_articles_category GET    /articles/categories/:id/edit(.:format) {:action=>"edit", :controller=>"articles/categories"}
     articles_category GET    /articles/categories/:id(.:format)      {:action=>"show", :controller=>"articles/categories"}
                       PUT    /articles/categories/:id(.:format)      {:action=>"update", :controller=>"articles/categories"}
                       DELETE /articles/categories/:id(.:format)      {:action=>"destroy", :controller=>"articles/categories"}
              articles GET    /articles(.:format)                     {:action=>"index", :controller=>"articles"}
                       POST   /articles(.:format)                     {:action=>"create", :controller=>"articles"}
           new_article GET    /articles/new(.:format)                 {:action=>"new", :controller=>"articles"}
          edit_article GET    /articles/:id/edit(.:format)            {:action=>"edit", :controller=>"articles"}
               article GET    /articles/:id(.:format)                 {:action=>"show", :controller=>"articles"}
                       PUT    /articles/:id(.:format)                 {:action=>"update", :controller=>"articles"}
                       DELETE /articles/:id(.:format)                 {:action=>"destroy", :controller=>"articles"}

P.S .: Если вам нужна дополнительная информация, дайте мне знать, и я также обновлю вопрос.


ОБНОВЛЕНИЕ I

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

namespace :articles do articles :categories end

scope :path => 'articles/categories/:id', :controller => 'articles/categories/concerns' do
  ...
end

resources :articles

ОБНОВЛЕНИЕ II

На мой взгляд /views/articles/categories/_content.html.erb файлов, которые у меня есть:

<div class="links">
  <%= link_to("New article", {:controller => content[:article_controller], :action => 'new'}) %>
</div>

В моих статьях :: Категории :: ConcernsController (то есть в файле app/controllers/articles/categories/concerns_controller.rb) у меня есть:

def show
  @articles_category = Articles::Category.find(params[:id])

  respond_to do |format|
    format.html {
      render :partial => '/views/articles/categories/_content.html.erb',
        :locals  => {
          :content => {
             :article_controller => '/articles'
          }
        }
        format.js  {
          ...
        end
  end
end

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Почему вы не используете link_to 'New article', new_article_path?Зачем использовать старый, усталый url_for ..., если вы можете использовать именованный помощник пути / URL (new_article_url).

0 голосов
/ 29 июля 2011

Вы пробовали использовать символы? Я думаю, что они более "прямые".

<%= link_to("New article", {:controller => content[:article_controller].to_sym, :action => :new}) %>

Вы пытались использовать релятивный путь?

<%= link_to("New article", {:controller => "../#{content[:article_controller]}", :action => 'new'}) %>
...