2010-09-18 7 views
7

У меня есть проблемы в связи с областями и form_for помощника в рельсах 3. маршрутов - файл выглядит следующим образом:form_for и прицелы, рельсы 3

scope "(/:tab)" do 
    resources :article 
end 

форма выглядит примерно так:

<%= form_for(@article) %> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    etc. 
<%end%> 

Атрибут tab - атрибут хранится в параметрах [: tab], в виде строки . Моя проблема в том, что эти genereate неправильные URL-адреса в форме. Как я могу заставить это работать? genreated URL article_path (PARAMS [: закладка], @article) отлично работает

ответ

10

Ответ, который я придумал с был довольно уродливым, но работает с обновлением и созданием:

<%= form_for(@article, :url => (@article.new_record? ? 
    articles_path(params[:tab]) : article_path(params[:tab], @article) do |f| %> 

Обновление: е: Лучшее решение было бы переопределить default_url_options-метод что-то вроде этого:

def default_url_options(options={}) 
    { :tab => params[:tab] } 
end 

< Тогда% = form_for @article сделать | F | %>, и все URL-адреса были правильно сгенерированы

+1

Спасибо, у меня была такая же проблема, и я искал решение этого. Я подумал, что будет более элегантное решение. FYI, просматривая помощник рельсов, кажется, предпочитает #persisted? на #new_record ?, поэтому, возможно, лучшей практикой было бы это сделать: '<% = form_for (@article,: url => (@ article.persisted?? article_path (params [: tab], @article) : articles_path (params [: tab]) do | f |%> ' –

+0

' default_url_options' в контроллере, он может быть закрытым. – whitehat101

1

Вы можете указать путь в явном виде:

<%= form_for(@article, :url => article_path(@article, :tab => params[:tab]) %> 
+2

Это похоже на работу с редактированием, но если я хочу использовать ту же форму как для новых, так и для редактирования, она не работает со следующей ошибкой в ​​новой, потому что в новой статье нет идентификатора – iverds

9

Try:

<%= form_for [:tab, @article] do |f| %> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    etc. 
<%end%> 
+1

. Затем он ищет tab_article_path, который не определен. – iverds

+0

Каковы маршруты, генерируемые вашим файлом route.rb? попробуйте «$ rake routes» в терминале – Yannis

+0

Наконец-то подходящее решение для этого !!! Большое спасибо. –

0

Я нашел, что это действительно раздражающая проблема, и теперь это происходит со следующим патчем обезьяны. В общем, это небольшая ставка, поскольку вы просто передаете весь пакет параметров в polymorphic_url, который является тем, что form_for использует под капотом, чтобы угадать маршрут. Более краткий подход состоял бы в том, чтобы объединить только значение области.

Мое решение:

https://gist.github.com/1848467

module ActionDispatch 
    module Routing 
    module PolymorphicRoutes 
     def polymorphic_path(record_or_hash_or_array, options = {}) 
     begin 
      polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path)) 
     rescue Exception => e 
      polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path).merge(params.reject{|k,v| ["controller", "action"].include? k.to_s})) 
     end 
     end 
    end 
    end 
end 
0

В очень похожей ситуации я определил сферу в маршрутах, как показано ниже:

scope :path => ":election_id", :as => "election" do 
    resources :questions 
end 

Теперь у меня есть помощники, как election_questions_path(@election)

В формах я могу использовать:

form_for [@election, @question] do |f| 
    ... 
end 

В приведенных выше примерах @election является экземпляром модели выбора.

После интеграции Friendly_id в это решение я получил несколько хороших URL-адресов. Например «http://mydomain.com/elections-2012/questions/my-question»

0

Моего решения аналогичной задачи с form_for и прицелы является определение нового метода в helpers/<model_name>/<model_name>_helper.rb, например, шахта sessions_helper.гь, который содержит

module Implant::SessionsHelper 
    def sessions_form_path(session) 
    session.new_record? ? sessions_path : session_path(session) 
    end 
end 

И на мой взгляд, я сделал

form_for(@session, url: sessions_form_path(@session)) do |f| 

Проблемные routes.rb часть

scope module: 'implant' do 
    resources :sessions 
end 

... и получить удалось с :tab парам вы можете добавить его в вспомогательный метод.

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