#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-3.1
#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-3.1
Вопрос:
Это мой маршрут:
scope ":username" do
resources :feedbacks
end
Когда я это делаю rake routes
, я получаю это:
feedbacks GET /:username/feedbacks(.:format) {:action=>"index", :controller=>"feedbacks"}
POST /:username/feedbacks(.:format) {:action=>"create", :controller=>"feedbacks"}
new_feedback GET /:username/feedbacks/new(.:format) {:action=>"new", :controller=>"feedbacks"}
edit_feedback GET /:username/feedbacks/:id/edit(.:format) {:action=>"edit", :controller=>"feedbacks"}
feedback GET /:username/feedbacks/:id(.:format) {:action=>"show", :controller=>"feedbacks"}
PUT /:username/feedbacks/:id(.:format) {:action=>"update", :controller=>"feedbacks"}
DELETE /:username/feedbacks/:id(.:format) {:action=>"destroy", :controller=>"feedbacks"}
Но когда я выполняю feedbacks_url или feedbacks_path, я получаю ошибку маршрутизации, подобную этой:
No route matches {:controller=>"feedbacks", :format=>nil}
Из файла журнала:
Rendered users/show.html.erb within layouts/application (18.3ms)
Completed 500 Internal Server Error in 142ms
ActionView::Template::Error (No route matches {:controller=>"feedbacks", :format=>nil}):
1: <%= form_for(@feedback) do |f| %>
2: <% if @feedback.errors.any? %>
3: <div id="error_explanation">
4: <h2><%= pluralize(@feedback.errors.count, "error") %> prohibited this feedback from being saved:</h2>
app/views/feedbacks/_form.html.erb:1:in `_app_views_feedbacks__form_html_erb__2195884682603870163_2484875900'
app/views/users/show.html.erb:11:in `_app_views_users_show_html_erb__3889159515317937411_2159438040'
app/controllers/vanities_controller.rb:14:in `show'
Это частичная форма feedbacks/_form.html.erb
:
<%= form_for(@feedback) do |f| %>
<% if @feedback.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@feedback.errors.count, "error") %> prohibited this feedback from being saved:</h2>
<ul>
<% @feedback.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<% if current_user %>
<div class="poster_id">
<%= f.hidden_field "poster_id", :value => current_user.id %><br />
</div>
<div class="receiver_id">
<%= f.hidden_field "receiver_id", :value => @user.id %><br />
</div>
<div class="field">
<%= f.text_field :content %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<% end %>
Мысли?
Ответ №1:
Ну,
scope ":username" do
означает, что :username
для правильной работы вашим маршрутам требуется некоторая информация.
Затем вы должны добавить эту информацию во все свои ссылки:
user_path(user, :username => "joe")
edit_user_path(user, :username => "joe")
...
Или вы могли бы сообщить своему приложению username
, что оно не является обязательным, что кажется логичным, если пользователь еще не создан. Поэтому измените свой маршрут на:
scope "(:username)" do
resources :feedbacks
end
Комментарии:
1.
feedback_url(user, @feedback)
Также не было бы возможно? Учитывая, что маршрут будет ожидать, что первым аргументом будетusername
?2. это последнее изменение редактирования
routes
файла работает отлично.3. @RyanBigg: я склонен быть очень явным, но да, может быть чище, чтобы избежать объявлений хэш-стиля.