Ruby on Rails-在编辑视图中选择保留单选按钮

时间:2018-08-29 21:20:04

标签: ruby-on-rails ruby

我有一个要创建的表单和一个要编辑我站点上某些信息的表单。在创建表单中,用户可以选择一些单选按钮,例如“是”或“否”,在我的数据库中,这些字段为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

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

谢谢。

1 个答案:

答案 0 :(得分: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