Я задал вопрос, похожий на этот, около недели назад, но это немного другая точка зрения. Суть вопроса заключается в том, чтобы быть перенаправленным на правильный контроллер.
У меня есть один ресурс, посты, и у меня есть 4 разные категории, в которых эти посты могут быть. Я хочу, чтобы каждая из этих категорий относилась к одному контроллеру, и поэтому у меня в маршрутах есть следующее:
resources "code", :controller => :code_posts, :as => :code
resources "sports", :controller => :sports_posts, :as => :sports
resources "gaming", :controller => :game_posts, :as => :gaming
resources "the-nation", :controller => :personal_posts, :as => :the_nation
Так что теперь я могу получить доступ к сообщениям через URL-адреса, такие как, например, / code / 1, / sports / 34, чтобы получить доступ к одному и тому же ресурсу сообщений, но каждый контроллер фокусируется на одной области, а именно на определенной категории.
Это все хорошо, но моя проблема возникает, когда я пытаюсь редактировать или сохранять определенные сообщения. У меня есть следующий частичный _form.html.erb (отображается в новых и редактируемых представлениях) во всех папках представлений для их конкретного контроллера:
<%= form_for @post do |f| %>
<div class="field">
<%= f.label :author %><br/>
<%= f.text_field :author %>
</div>
<div class="field">
<%= f.label :title %><br/>
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :category %>
<%= f.select :category_id, Category.all.collect {|c| [c.name, c.id] }, {:include_blank => true} %>
</div>
<div class="field">
<%= f.label :summary %><br/>
<%= f.text_area :summary, :rows => 5 %>
</div>
<div class="field">
<%= f.label :body %><br/>
<%= f.text_area :body %>
</div>
<div class="field">
<%= f.label :tag_tokens %><br/>
<%= f.text_field :tag_tokens, "data-pre" => @post.tags.map(&:attributes).to_json %>
</div>
<div class="field">
<%= f.submit "Submit" %>
</div>
<% end %>
Так что всякий раз, когда я создаю или обновляю сообщение с помощью любых контроллеров, меня всегда перенаправляют обратно на / posts / 4, / posts / 123, / posts /: id, что угодно. Я хочу, чтобы меня перенаправили на конкретный контроллер, под которым редактируется или создается пост. Поэтому, если я перехожу в / code / new и отправляю новое сообщение, я хочу, чтобы меня перенаправили в / code / 1234, а не в / posts / 1234. Как я могу это сделать? По какой-то причине у меня сегодня утром серьезные проблемы с психикой. Спасибо.
РЕДАКТИРОВАТЬ Обновлено <%= form_for @post do |f| %>
до <%= form_for @post, :url => code_url(@post) do |f| %>
, и это работает для / code / 1 / edit, но не / code / new. При попытке получить доступ к новой форме сообщения, я получаю следующую ошибку:
No route matches {:action=>"show", :controller=>"code_posts", :id=>#<Post id: nil, author: "Les Peabody", summary: nil, body: nil, created_at: nil, updated_at: nil, title: nil, category_id: 1, slug: nil>}
Это мой CodePostsController # новый метод
def new
@post = Post.new(:category => Category.find_by_name("Programming"), :author => current_user.full_name)
end