最好的方法来重写/个人资料/ 1 /编辑/详细信息/ me / profile / details?

时间:2013-09-14 18:14:52

标签: ruby-on-rails routing namespaces rewrite ruby-on-rails-4

我试图在" me"下命名几条路线。 / me部分在此命名空间下拥有所有基于用户配置文件/帐户的内容,以实现更清晰的路由。

最好的方法是什么?我发现重写默认的REST路由(profiles / 1 / edit)会产生一些问题,比如表单没有更新。

路线

get "/me/profile"              => "profiles#show", :as => :my_profile
get "/me/profile/:what"        => "profiles#edit", :as => :my_profile_edit
post "/me/profile/:what"       => "profiles#edit"

ProfilesController

def edit
  @profile      = current_user.profile
  if ["basics", "location", "details", "photos"].member?(params[:what])
    render :action => "edit/edit_#{params[:what]}"
  else
    render :action => "edit/edit_basics"
  end
end

def update
  @profile        = current_user.profile
  @profile.form   = params[:form]
  respond_to do |format|
    if @profile.update_attributes!(params[:profile])
      format.html { redirect_to :back, :notice => t('notice.saved') }
    else
      format.html { render action => "/me/profile/" + @profile.form }
    end
  end
end

如果上面的感觉对REST原则非常糟糕。我怎样才能以更好的方式实现想要的结果?

1 个答案:

答案 0 :(得分:1)

好吧,如果你真的想坚持REST那么多,我建议将:what移到GET参数哈希中。然后你可以像这样重写你的路线

scope "/me" do
  resource :profile, :only => [:show, :edit, :update]

所以你要将编辑页面作为profile_edit_path(:what => "details")

进行处理

更多关于代码的事情。

  • 您应该将update_attributes更改为update
  • 你不应该使用redirect:back,'因为它会渲染一个js后退链接而不是实际请求,所以你不会看到实际的变化
  • 您应该将render action =>更改为render :template =>
  • 除非您使用strong_params,否则不应在更新状态中使用params[:profile]。您需要指定表格允许的参数。这样做是为了防止大规模分配。

认为你应该看看CodeSchool tutorial on Rails 4