【问题标题】:Ruby on Rails - Preserve radio button selected on edit viewRuby on Rails - 保留在编辑视图中选择的单选按钮
【发布时间】:2018-08-31 02:16:33
【问题描述】:

我有一个要创建的表单和一个用于编辑我网站上的一些信息的表单。在创建表单中,用户可以选择一些单选按钮,例如“是”或“否”,在我的数据库中这些字段是Boolean(真或假)。

在我的表单版本中,如何保留选定的单选按钮?目前,如果用户选择任何选项,编辑视图不会保留此信息,并且仅显示空白单选按钮。

edit.html.erb

<%= form_tag guide_dog_form_path(@guidedoguser), method: "put" do %>
  <%= radio_button_tag :work, @guidedoguser.work %>
<% end %>

controller.rb

class GuideDogFormsController < ApplicationController

  def create
    @contact = GuideDogForm.new(params[:contact])
    if @contact.save
      GuideDogMailer.delay_for(10.seconds, retry: true).create(@contact)
      render nothing: true, status: 200
    else
      render nothing: true, status: 400
    end
  end

  def edit
    @guidedoguser = GuideDogForm.where(rg: params[:rg]).first
  end

  def update
    @guidedoguser = GuideDogForm.where(rg: params[:rg]).first
    if @guidedoguser.update(work: params[:work])
      redirect_to guide_dog_form_path(@guidedoguser)
    else 
      render 'edit'
    end
  end

end

如何在单选按钮中显示两个选项(是或否)并保留创建时选择的选项?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您不应该为此需要两个单独的表格。您可以只使用一个,并使用 form_for (https://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/FormHelper.html) 而不是 form_tag。当你有一个模型要操作时,你应该使用 form_for。 form_tag 用于没有支持模型的表单。同样,radio_button_tag 是当您没有支持模型时,而 radio_button (https://apidock.com/rails/ActionView/Helpers/FormHelper/radio_button) 是当您有支持模型时。既然你有一个模型,你应该走 form_tag 路线。我建议将其更改为(假设您的 GuideDogForm 模型上有一个“工作”属性):

    edit.html.erb(您可以将其复制并粘贴到 new.html.erb 中,它应该可以像您期望的新记录一样工作)

    <%= form_for @guidedoguser do do |f| %>
      <%= f.radio_button :work %>
    <% end %>
    

    控制器:

    class GuideDogFormsController < ApplicationController
      def new
        @guidedoguser = GuideDogForm.new
      end
    
      def create
        @guidedoguser = GuideDogForm.new(guide_dog_params)
        if @guidedoguser.save
          GuideDogMailer.delay_for(10.seconds, retry: true).create(@guidedoguser)
          render nothing: true, status: 200
        else
          render nothing: true, status: 400
        end
      end
    
      def edit
        @guidedoguser = GuideDogForm.where(rg: params[:rg]).first
      end
    
      def update
        @guidedoguser = GuideDogForm.where(rg: params[:rg]).first
        if @guidedoguser.update_attributes(guide_dog_params)
          redirect_to guide_dog_form_path(@guidedoguser)
        else 
          render 'edit'
        end
      end
    
      private
    
      def guide_dog_params
        # note if you have more fields you want to persist in your model from your form, you will
        # need to add them here after :work
        params.require(:guide_dog_form).permit(:work)
      end
    end
    

    【讨论】:

    • 谢谢@bkimble。这应该适用于特定的 Rails 版本吗?我试过但收到错误“未定义的方法`radio_button_tag'”。它可以是什么?我使用 Rails 4.1.5
    • 抱歉,我在原帖中有错字 - 应该是 f.radio_button 。我更新了我的答案!
    • 您的第一段 (#update/#update_column) 不完全正确。大多数时候使用#update 是首选,因为#update_column 直接在数据库中更新属性。跳过 Rails 验证和回调。请参阅#update_columns 文档。
    • 你是对的。我正在查看 AR::Base.update ,它需要一个 ID 和哈希。修复我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多