2010-09-18 30 views
7

Tôi có một vấn đề do phạm vi và các helper form_for trong đường ray 3. Các tuyến - tập tin trông như thế này:form_for và phạm vi, ray 3

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

Hình thức trông giống như sau:

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

Tab - thuộc tính được lưu trữ trong params [: tab], dưới dạng chuỗi Vấn đề của tôi là do lỗi này tạo ra các url sai trong biểu mẫu. Làm thế nào tôi có thể có được điều này để làm việc? Các article_path url genreated (params [: Tab], @article) hoạt động hoàn toàn tốt đẹp

Trả lời

10

Câu trả lời tôi đã đưa ra với khá xấu xí nhưng hoạt động với cả bản cập nhật và tạo:

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

Updat e: Một giải pháp tốt hơn sẽ được ghi đè lên default_url_options-phương pháp để một cái gì đó như thế này:

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

Sau đó <% = form_for @article làm | f | %> có thể được sử dụng và tất cả các url được tạo chính xác

+1

Cảm ơn, tôi đã có cùng một vấn đề chính xác và đã tìm kiếm giải pháp cho vấn đề này. Tôi nghĩ rằng sẽ có một giải pháp thanh lịch hơn. FYI, nhìn qua helper đường ray, nó có vẻ thích #persisted? #new_record ?, vì vậy, có thể cách thực hành tốt nhất là thực hiện việc này thay vì: '<% = form_for (@article,: url => (@ article.persisted?? article_path (params [: tab], @article) : articles_path (params [: tab]) do | f |%> ' –

+0

' default_url_options' trong bộ điều khiển, nó có thể là riêng tư. – whitehat101

1

Bạn có thể chỉ định đường dẫn rõ ràng:

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

Điều này dường như hoạt động tốt trên phần chỉnh sửa, nhưng nếu tôi muốn sử dụng cùng một biểu mẫu cho cả mới và chỉnh sửa, nó không thành công với lỗi sau trong bài mới vì bài viết mới không có id – iverds

9

Hãy thử:

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

Sau đó, tìm kiếm tab_article_path không được xác định. – iverds

+0

Các tuyến đường được tạo bởi tệp routes.rb của bạn là gì? thử "$ rake tuyến đường" trong một thiết bị đầu cuối – Yannis

+0

Cuối cùng là một giải pháp thích hợp cho điều đó !!! Cảm ơn rất nhiều. –

0

Tôi đã nhận thấy đây là một vấn đề thực sự khó chịu và đã giải quyết vấn đề này ngay bây giờ với bản vá khỉ sau. Chung như thế này, đó là một chút giá thầu khi bạn chỉ đơn giản là chuyển toàn bộ các thông số thành polymorphic_url, đó là những gì form_for sử dụng dưới mui xe để đoán lộ trình. Một cách tiếp cận ngắn gọn hơn là hợp nhất chỉ giá trị phạm vi.

Giải pháp của tôi:

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

Trong một tình huống rất giống tôi xác định phạm vi trong các tuyến đường như dưới đây:

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

Bây giờ tôi có người giúp đỡ như election_questions_path(@election)

Trong các biểu mẫu tôi có thể sử dụng:

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

Trong ví dụ trên @election là ví dụ của mô hình Bầu cử.

Sau khi tích hợp Friendly_id vào giải pháp này, tôi nhận được một số url khá. Ví dụ "http://mydomain.com/elections-2012/questions/my-question"

0

giải pháp của tôi về vấn đề tương tự với form_for và phạm vi là xác định phương pháp mới trong helpers/<model_name>/<model_name>_helper.rb, ví dụ tôi là sessions_helper.rb chứa

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

Và theo quan điểm của tôi, tôi đã

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

Problematic phần routes.rb

scope module: 'implant' do 
    resources :sessions 
end 

... và để quản lý với :tab param bạn có thể thêm nó vào phương thức trợ giúp.

Các vấn đề liên quan