我有一组嵌套资源 - :users和:messages。
resources :users, :only => [:show,:index] do
resources :messages
end
还有Message模型的“new.html.haml”模板中的formtastic表单,它需要使用这些资源:
=semantic_form_for [@user,@message] do |f|
=f.input :title
问题在于[@ user,@ message]生成的实际操作路径,它看起来像这样:
/users/4cdc7f9dfae434029a0000aa/messages
这是错误的,因为我使用的是命名路由,所以这应该看起来像“/ users / nickname / messages”
如何确保@user生成正确的路径输出?
编辑:这是我用来强制用户的名称路线。
match "/users/:nickname/messages" => "messages#index"
match "/users/:nickname/messages/new" => "messages#new", :as=>:new_message
match "/users/:nickname/messages" => "messages#create", :as=>:create_message
答案 0 :(得分:4)
我想你想要的是使用昵称作为url slug。您需要的只是常规嵌套资源;
# in routes.rb
resources :users do
resources :messages
end
会给你相同的路线,除非他们在那里有:id
而不是:nickname
。
现在让您使用用户的昵称作为网址标识符的实际技巧:
# user.rb
class User < ActiveRecord::Base
def to_param
self.nickname
end
end
您会自动在网址中获取昵称,并将其作为params[:id]
传递给控制器,因此您必须在控制器中采取相应措施
# users_controller.rb
…
def show
@user = User.find_by_nickname(params[:id])
end
…
答案 1 :(得分:0)
这应该可以解决问题
=semantic_form_for :message, :url => create_message_path(:nickname => @user.nickname) do |f|
# ...