2013-08-30 5 views
1

내 응용 프로그램에서 작동하는 Globalize3을 얻으려고합니다. 나는 번역하고자하는 블로그 게시물의 장난감 프로젯을 가지고있다.form_for ID와 로케일 매개 변수를 섞음

내 URL은 다음과 같이 : localhost/en/postslocalhost/fr/posts

여기 내가 작성 및 게시물을 업데이트하기 위해 같은 form_for을 사용하고 내 ApplicationController

before_action :set_locale 

def set_locale 
    I18n.locale = params[:locale] if params[:locale] || I18n.default_locale 
end 

에서 그것을 할 방법입니다.

<%= form_for(@post) do |f| %> 
... 
<% end %> 

나는 /new 페이지로 이동하면 그것은 잘 동작, 여기에 컨트롤러 코드입니다 : 다음은 뷰 코드의

def new          
    @post = Post.new       
end 

def create         
    @post = Post.new(post_params)    

    if @post.save        
    redirect_to action: :show, id: @post.id 
    else          
    render 'new'       
    end          
end  

는 그러나 나는 URL을 /en/posts/1/edit에 게시물을 편집하려고 할 때, form_for에 전달 된 매개 변수를 혼합합니다.

없음 경로 일치에게 : 즉, 오류 메시지의 {: 행동 => "쇼": 컨트롤러 => "게시물": 로케일 => # : ID => 무기 호 : 형식 => 전무} 실종 필요한 키 : [: 로케일 : ID]

내 질문은 : 왜 그 일을합니까 내가 thix을 어떻게 해결할 수 있습니까? 내 게시물이 id

이 없기 때문에 new

<%= form_for(@post, url: {action: 'show', id: @post, locale: params[:locale]}) do |f| %>

그래서 update와 함께 작동하지만이 :


나는 이미이에 form_for 선언 변경과 같은 몇 가지를 시도했습니다
No route matches {:action=>"show", :locale=>"en", :id=>#<Post id: nil, created_at: nil, updated_at: nil, title: nil, text: nil>, :controller=>"posts"} 

그래서 그래, 난 정말 만들고 업데이트에 대한이 양식을 사용하지 않으려는 내가 그 일을 피할 수 있다면. 이 작업을 수행하는 좋은 방법이 있습니까?

편집 :

여기 내 레이크 노선

Prefix Verb URI Pattern      Controller#Action 
    posts GET /:locale/posts(.:format)   posts#index {:locale=>/en|fr/} 
      POST /:locale/posts(.:format)   posts#create {:locale=>/en|fr/} 
new_post GET /:locale/posts/new(.:format)  posts#new {:locale=>/en|fr/} 
edit_post GET /:locale/posts/:id/edit(.:format) posts#edit {:locale=>/en|fr/} 
    post GET /:locale/posts/:id(.:format)  posts#show {:locale=>/en|fr/} 
      PATCH /:locale/posts/:id(.:format)  posts#update {:locale=>/en|fr/} 
      PUT /:locale/posts/:id(.:format)  posts#update {:locale=>/en|fr/} 
      DELETE /:locale/posts/:id(.:format)  posts#destroy {:locale=>/en|fr/} 
+0

레이크 경로의 출력을 표시 할 수 있습니까? 편집하려고 할 때 오류가 발생했다고하셨습니까? 편집 페이지로 이동하기 위해 클릭하는 링크는 무엇입니까? – dax

답변

4

그것은 새에 대해 별도의 형태로 용기를 가지고 이와 같은 작업을 편집 할 수 어쩌면 약간의 추가 작업하지만 여전히 가능 패턴입니다 :

new.html.erb 

<%= form_for(@post, url: posts_path) do |f| %> 
    <%= render 'form', f: f %> 
    <%= f.submit 'Create' %> 
<% end %> 

edit.html.erb 

<%= form_for(@post, url: post_path(@post)) do |f| %> 
    <%= render 'form', f: f %> 
    <%= f.submit 'Update' %> 
<% end %> 

은 그래서 하나 개의 옵션입니다. _form.html.erb 부분의 일반적인 양식 필드를 렌더링하고 각각의 양식 컨테이너에서 새로운/편집에 고유 한 작업을 수행합니다.

<%= form_for(@post, url: (@post.new_record? ? posts_path : post_path(@post))) do |f| %> 

참고 : 당신이 정말 당신은 항상이 작업을 수행 할 수있는 하나의 형태로 컨테이너 파일이하려는 경우

는하지만, 내가 로케일 보석이 어떻게 작동하는지 정확히 모르겠어요를 그래서 나는 그 위의 제외 ...하지만 로캘을 명시 적으로 포함해야하는 경우 예를 들어 로캘을 명시 적으로 포함 할 수 있습니다. post_path(@post, locale: params[:locale]). 실제로 post_path(@post)post_path(id: @post)의 약자입니다.즉, 명명 된 경로에 전달하는 매개 변수는 명시 적으로 지정하지 않으면 경로가 예상 한 것과 동일하게 정렬됩니다.

+0

최초의 솔루션이 효과가있었습니다. 감사합니다. – Pacane

+0

어떤 이유에서든'resources : entity'를 사용하지 않는다면'get '/ entities/: entity_id/edit'와 같은 경로에 뭔가있을 수 있습니다. : to => 'entities # edit'' so 'form_for'의 url은'entity_path (entity_id : @post)'처럼 보일 것입니다. 아주 좋은 해결책은 당신에게 감사합니다! – unmultimedio