路由和嵌套资源
问题描述:
我有一组嵌套的资源 - :用户和:消息。路由和嵌套资源
resources :users, :only => [:show,:index] do
resources :messages
end
而且也为消息模式“new.html.haml”模板formtastic形式,它需要使用这些资源:
=semantic_form_for [@user,@message] do |f|
=f.input :title
的问题是,在实际操作路径从[@用户,@消息]生成的,它看起来像这样:
/users/4cdc7f9dfae434029a0000aa/messages
这是错误的,因为我使用了一个名为路线,所以这应该看起来像“/用户/昵称/邮件”
如何确保@user生成正确的路径输出?
编辑:这是我使用slugify用户的路线名称。
match "https://stackoverflow.com/users/:nickname/messages" => "messages#index"
match "https://stackoverflow.com/users/:nickname/messages/new" => "messages#new", :as=>:new_message
match "https://stackoverflow.com/users/:nickname/messages" => "messages#create", :as=>:create_message
答
我想你想要的是使用昵称作为URL蛞蝓。你需要的只是常规的嵌套资源;
# in routes.rb
resources :users do
resources :messages
end
这将使你同样的路线,除了他们将有:id
而不是:nickname
在那里。
现在的实际技巧,让您使用用户的昵称作为URL标识:
# user.rb
class User < ActiveRecord::Base
def to_param
self.nickname
end
end
你会自动获得在URL中的昵称,并把它传递给你的控制器为params[:id]
,所以你必须在您的控制器中采取相应措施
# users_controller.rb
…
def show
@user = User.find_by_nickname(params[:id])
end
…
答
这应该做的伎俩
=semantic_form_for :message, :url => create_message_path(:nickname => @user.nickname) do |f|
# ...