form_for и области применения, рельсы 3 - PullRequest
7 голосов
/ 18 сентября 2010

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

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

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

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

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

Ответы [ 6 ]

11 голосов
/ 07 ноября 2010

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

<%= 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 do | f | Можно использовать%>, и все URL генерируются правильно

10 голосов
/ 19 сентября 2010

Попробуйте:

<%= form_for [:tab, @article] do |f| %>
   <%= f.label :title %>
   <%= f.text_field :title %>
    etc.
<%end%>
1 голос
/ 19 сентября 2010

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

<%= form_for(@article, :url => article_path(@article, :tab => params[:tab]) %>
0 голосов
/ 19 июля 2016

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

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|

Проблемные route.rb part

scope module: 'implant' do
  resources :sessions
end

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

0 голосов
/ 09 сентября 2012

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

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

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

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

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

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

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

0 голосов
/ 17 февраля 2012

Я обнаружил, что это действительно раздражающая проблема, и обошел ее пока с помощью следующего патча обезьяны.В общем, это немного сбивает с толку, так как вы просто передаете весь пакет параметров в 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
...