link_to в Rails 3.1 - PullRequest
       42

link_to в Rails 3.1

0 голосов
/ 16 октября 2011

Я конвертирую приложение из рельсов 2 в рельсы 3, и может кто-нибудь помочь мне с этим небольшим кусочком кода. link_to не работает, может кто-нибудь указать мне, как правильно использовать link_to вместо link_to_remote в rails 3.1?Код Rails 2

<%= link_to_remote  package_item.getId(),
                    :url => { :controller => 'cmn/popup',
                              :action     => "show_popup",
                              :frame_url  =>  admin_url( 
                                                :ctrl   => controller,
                                                :app_action => 'package.item.edit',
                                                :id     => package_item.getId().to_s,
                                                :remote => true
                                              ),
                              :frame_width  => '570px',
                              :frame_height => '355px'
                            }
%>

Код Rails 3.1

<%= link_to package_item.getId(),
            :url => { :controller => 'cmn/popup',
                      :action     => "show_popup",
                      :frame_url  =>  admin_url( 
                                        :ctrl => controller,
                                        :app_action => 'package.item.edit',
                                        :id   => package_item.getId().to_s
                                      ),
                      :frame_width  => '570px',
                      :frame_height => '355px',
                      :remote       => true
                    }
%>

Я заменяю весь файл .rjs на .js.erb.Это URL, который я получаю в Rails 3:

<a href="/common/login/en/sentry?url%5Baction%5D=show_popup&amp;url%5Bcontroller%5D=cmn%2Fpopup&amp;url%5Bframe_height%5D=355px&amp;url%5Bframe_url%5D=%2Fcommon%2Flogin%2Fen%2Fsentry%3Fapp_action%3Dpackage.item.edit%26id%3D3%26remote%3Dtrue&amp;url%5Bframe_width%5D=570px&amp;url%5Bremote%5D=true">3</a>

Это в Rails 2:

<a href="#" onclick="new Ajax.Request('/cmn/popup/show_popup?frame_height=355px&amp;frame_url=%2Fcmn%2Fcmn%2Findex%2F2%3Fapp_action%3Dpackage.item.edit%26amp%3Bbrand%3Dsentry%26amp%3Blanguage%3Den&amp;frame_width=570px', {asynchronous:true, evalScripts:true}); return false;">2</a>

мой контроллер

    def show_popup
      @content_data = {}
      @content_data.merge!(params)
      render(:template => 'cmn/popup/show_popup', :nolayout => 1)
  end

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Пожалуйста, посмотрите на синтаксис link_to в Rails 3: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

У вас есть все параметры в хеше :url, но вам не нужно называть его :url, просто передайте параметры в хэше, например:

<%= link_to package_item.getId(),
        { 
                  :controller => 'cmn/popup',
                  :action     => "show_popup",
                  :frame_url  =>  admin_url( 
                                    :ctrl => controller,
                                    :app_action => 'package.item.edit',
                                    :id   => package_item.getId().to_s
                                  ),
                  :frame_width  => '570px',
                  :frame_height => '355px'
        },
        :remote       => true
%>

Не забудьте получить :remote из хеша URL.

Дайте мне знать, если это работает.

0 голосов
/ 16 октября 2011

Впервые я вижу строку, определяющую путь как параметр: controller.

Я имею в виду de: controller => 'cmn / popup'.Это ново для меня, и это кажется странным.

Вы уверены, что это работает, и запрос получен правильным контроллером и действием?

Другая вещь, которую я думаю, может быть сложной, это вызов рендеринга на контроллере.Просто позвоните

render :layout => false

или, возможно, вообще ничего не вызывайте.

Если шаблон имеет то же имя, что и действие, и он помещен в каталог с именем, подобным контроллеру, rails знает, чтоШаблон должен быть представлен и расширение (js / html / xml) основано на типе запроса.Возможно render: template => .... заставляет рендерить html шаблон.

Опция: nolayout, я думаю, что она недопустима.В любом случае, если запрос относится к файлу javascript, он никогда не отображает макет.

...