Rails 5 单更新控制器对应多编辑视图实现方案咨询
解决方案:复用Update动作实现分页面编辑用户档案与糖尿病设置
嘿,我来帮你搞定这个需求!要实现分开编辑基础用户信息和时段胰岛素系数,同时复用同一个update动作,咱们可以按以下步骤来操作:
1. 配置自定义路由
首先得给糖尿病设置编辑页配置对应的路由,让用户能通过/users/:id/edit/diabsettings访问。在config/routes.rb里添加嵌套的成员路由:
resources :users do # 为单个用户添加糖尿病设置编辑的GET路由 get 'edit/diabsettings', on: :member, as: :edit_diabsettings end
这个路由会生成edit_user_diabsettings_path(user)的辅助方法,方便在视图里跳转。
2. 动态调整参数白名单
因为基础编辑和糖尿病设置编辑提交的参数完全不同,咱们需要在users_controller.rb的user_params方法里做条件判断,只允许当前场景需要的字段:
private def user_params # 定义两组参数:基础信息和糖尿病设置 base_profile_fields = [:name, :email, :password, :password_confirmation] diab_settings_fields = [ :zero_till_one, :one_till_two, :two_till_three, :three_till_four, :four_till_five, :five_till_six, :six_till_seven, :seven_till_eight, :eight_till_nine, :nine_till_ten, :ten_till_eleven, :eleven_till_twelve, :twelve_till_thirteen, :thirteen_till_fourteen, :fourteen_till_fifteen, :fifteen_till_sixteen, :sixteen_till_seventeen, :seventeen_till_eightteen, :eightteen_till_nineteen, :nineteen_till_twenty, :twenty_till_twentyone, :twentyone_till_twentytwo, :twentytwo_till_twentythree, :twentythree_till_zero ] # 判断当前提交的参数属于哪一组 if params[:user].keys.any? { |key| diab_settings_fields.include?(key.to_sym) } params.require(:user).permit(diab_settings_fields) else params.require(:user).permit(base_profile_fields) end end
这样既符合Rails的强参数安全规范,又能适配两种编辑场景。
3. 创建糖尿病设置编辑视图
在app/views/users/目录下新建edit_diabsettings.html.erb,专门用来展示时段系数的编辑表单。表单提交路径还是指向用户的update路由(复用同一个动作):
<h1>编辑胰岛素时段系数</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_with(model: @user, local: true) do |f| %> <%= render 'shared/error_messages', object: @user %> <%# 逐个渲染时段系数字段,这里示例两个,你可以批量循环或者手动添加 %> <div class="form-group"> <%= f.label :zero_till_one, "0:00 - 1:00 胰岛素系数" %> <%= f.number_field :zero_till_one, step: 0.1, class: "form-control" %> </div> <div class="form-group"> <%= f.label :one_till_two, "1:00 - 2:00 胰岛素系数" %> <%= f.number_field :one_till_two, step: 0.1, class: "form-control" %> </div> <%# 剩下的时段字段按同样方式添加 %> <%= f.submit "保存设置", class: "btn btn-primary" %> <% end %> <%= link_to "返回个人主页", @user, class: "btn btn-secondary mt-2" %> </div> </div>
4. 适配Update动作的视图渲染与跳转
默认的update动作会在验证失败时渲染edit视图,咱们需要调整一下,让它根据当前编辑的场景渲染对应的视图;成功时也可以跳转到对应的页面提升用户体验:
def update @user = User.find(params[:id]) if @user.update_attributes(user_params) # 根据更新的字段组设置不同的提示信息 flash[:success] = if user_params.keys.any? { |k| k.start_with?('zero_till') } "胰岛素设置已更新" else "个人档案已更新" end # 成功后跳转到对应的页面:设置页或个人主页 redirect_path = user_params.keys.any? { |k| k.start_with?('zero_till') } ? edit_user_diabsettings_path(@user) : @user redirect_to redirect_path else # 验证失败时渲染对应的编辑视图 if user_params.keys.any? { |k| k.start_with?('zero_till') } render 'edit_diabsettings' else render 'edit' end end end
5. 添加跳转入口
最后,在用户的基础编辑页或者个人主页添加跳转到糖尿病设置编辑页的链接,方便用户访问:
<%# 在app/views/users/edit.html.erb或者show.html.erb中添加 %> <%= link_to "编辑胰岛素时段系数", edit_user_diabsettings_path(@user), class: "btn btn-secondary" %>
这样整个流程就通了:用户登录后可以分别编辑基础信息和胰岛素设置,两个页面都复用同一个update动作,既保持了代码的简洁性,又给用户清晰的操作体验。
内容的提问来源于stack exchange,提问作者Sebastian Peter
相关产品推荐
相关产品推荐

