Ruby on rails 对restful设计的建议?
我有一个关于为我正在开发的应用程序的特定部分构建restful设计的最佳方法的问题 应用程序的一些背景信息:Ruby on rails 对restful设计的建议?,ruby-on-rails,ruby,ruby-on-rails-3,rest,architecture,Ruby On Rails,Ruby,Ruby On Rails 3,Rest,Architecture,我有一个关于为我正在开发的应用程序的特定部分构建restful设计的最佳方法的问题 应用程序的一些背景信息: User has_one :settings_for_email 有一个配置文件控制器,它有一个显示动作。。比如: def show @user = current_user end <% form_for profile_path(@user) do |f| %> <% f.fields_for :settings_for_email do |s| %&g
User has_one :settings_for_email
有一个配置文件控制器,它有一个显示动作。。比如:
def show
@user = current_user
end
<% form_for profile_path(@user) do |f| %>
<% f.fields_for :settings_for_email do |s| %>
<% ... form fields ... %>
<% end %>
<% end %>
最初是这样设置的,以便表单发回配置文件控制器。。比如:
def show
@user = current_user
end
<% form_for profile_path(@user) do |f| %>
<% f.fields_for :settings_for_email do |s| %>
<% ... form fields ... %>
<% end %>
<% end %>
我不喜欢这个,因为它有一个漏洞,允许修改正在编辑的用户记录。。。将其更改为@user=current_user对我来说没有多大意义,因为这是一个需要某种ID的更新操作。。因此,转到/profile/123或profile/456将产生相同的用户记录(因为它将使用当前用户,所以参数[:id]将是多余的)。。我觉得这很奇怪
作为补充说明,我需要一个控制器操作来将用户的电子邮件设置重置为默认设置
所以,我最终做的是开辟一条新路线:
resource :settings_for_email, :only => :create do
post :reset, :on => :member
end
然后为电子邮件控制器创建设置:
#settings_for_email_controller.rb
def create
current_user.settings_for_email.update_attributes(params[:settings_for_email_controller])
redirect_to profile_url
end
def reset
current_user.reset_settings_for_email!
redirect_to profile_url
end
但后来我想,这有什么办法可以改进吗
如果我真的想让这个100%的安静,最好是:
#update_settings_for_email_controller:
def create
current_user.settings_for_email.update_attributes(params[:settings_for_email_controller])
redirect_to profile_url
end
#reset_settings_for_email_controller:
def create
current_user.reset_settings_for_email!
redirect_to profile_url
end
我对此持怀疑态度,因为为它配备两个控制器似乎有点愚蠢。。但是我想不出更好的办法了。同样,使用更新需要id,销毁也需要id。我原本认为使用销毁操作来执行“重置”会很好,但是——再次。。它将涉及一个浪费的id参数。所以我想在这里问一下你们对这类事情的看法?我想你们把事情搞混了:这里有两个用户。有一个用户的详细信息需要更改,然后有一个用户进行实际更改。通常,它们是相同的,但并不总是相同的,例如:管理员可能需要重置某些用户的密码 正在更改的用户记录的id应该进入REST界面,并且
user.find params[:id]
应该可以很好地处理这个问题
进行更改的用户必须进行身份验证(确保该用户是她声称的用户)和授权(允许该用户进行更改吗?)。这就是调用当前用户时得到的用户。Gems希望能帮上忙
通常,控制器操作应获得当前用户
,目标用户应确保当前用户有权对目标用户执行操作(因为他们是同一用户,当前用户是管理员或应用程序中的任何其他逻辑)然后才执行该操作。我认为你把事情搞混了:这里有两个用户。有一个用户的详细信息需要更改,然后有一个用户进行实际更改。通常,它们是相同的,但并不总是相同的,例如:管理员可能需要重置某些用户的密码
正在更改的用户记录的id应该进入REST界面,并且user.find params[:id]
应该可以很好地处理这个问题
进行更改的用户必须进行身份验证(确保该用户是她声称的用户)和授权(允许该用户进行更改吗?)。这就是调用当前用户时得到的用户。Gems希望能帮上忙
通常,控制器操作应获得当前用户
,目标用户应确保当前用户有权对目标用户执行操作(因为他们是同一用户,当前用户是管理员或应用程序中的任何其他逻辑)然后才执行该操作。据我所知,我的控制器操作应该是:user=user.find(params[:id]);如果用户!=当前用户;呈现:text=>“错误!!!”;其他的更新_属性(参数[:user]);结束?这就是你的意思吗?这似乎是一个愚蠢的条件检查,因为登录用户(当前用户)将始终是应该更新的记录?据我所知,我的控制器操作应该是:user=user.find(params[:id]);如果用户!=当前用户;呈现:text=>“错误!!!”;其他的更新_属性(参数[:user]);结束?这就是你的意思吗?这似乎是一个愚蠢的条件检查,因为登录用户(当前用户)将始终是应该更新的记录?