加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – (如何)我可以使用表单对象进行编辑/更新例程吗

发布时间:2020-12-17 02:05:09 所属栏目:百科 来源:网络整理
导读:忍不住尝试重新启动 RailsForum并转发这个问题 here. 我有以下表单对象(在Rails 4中) class StationForm include Virtus include ActiveModel::Model # I think this is unnecessary # extend ActiveModel::Naming # include ActiveModel::Conversion # incl
忍不住尝试重新启动 RailsForum并转发这个问题 here.

我有以下表单对象(在Rails 4中)

class StationForm
    include Virtus

    include ActiveModel::Model
    # I think this is unnecessary
    #   extend ActiveModel::Naming
    #   include ActiveModel::Conversion
    #   include ActiveModel::Validations


# Station
    attr_reader :station

    attribute :station_name,String
    attribute :station_description,String

# Address
    attr_reader :address

    attribute :address_url,String
    attribute :address_priority,Integer
    attribute :address_is_active,Boolean

    def persisted?
        false
    end

    def save
        if valid?
            persist
            true
        else
            false
        end
    end

private

    def persist
        @station = Station.create(name: station_name,description: station_description)
        @address = @station.addresses.create(url: address_url,priority: address_priority,is_active: address_is_active)
    end
end

我可以在new / create方法中使用这个表单对象

class StationsController < ApplicationController
    def new
        @station_form = StationForm.new
    end

    def create
        @station_form = StationForm.new(station_form_params)
        @station_form.save

        redirect_to station_path(@station)
    end

private

    def station_form_params
        params.require(:station_form).permit(:station_name,:station_description,:address_url,:address_priority,:address_is_active)
    end
end

但是,我没有成功将它用于编辑/更新程序……

是否可以使用表单对象进行编辑/更新,如果是,将如何完成?

解决方法

您必须使用StationForm对象中的“initialize”方法将其用于编辑.如果你传递一个id,它将假设该对象已经存在,并从那里我们可以将它视为一个持久化对象.
还添加“update”方法来更新对象的属性.

class StationForm
include Virtus.model

include ActiveModel::Model
# I think this is unnecessary
#   extend ActiveModel::Naming
#   include ActiveModel::Conversion
#   include ActiveModel::Validations


attr_reader :station

attribute :station_name,String
attribute :station_description,String

attr_reader :address

attribute :address_url,String
attribute :address_priority,Integer
attribute :address_is_active,Boolean

def initialize(attr = {})
 if !attr["id"].nil?
    @station = Station.find(attr["id"])
    @address = @station.addresses.first
    self[:station_name] = attr[:station_name].nil? ? @station.name : attr[:station_name]
    self[:station_description] = attr[:station_description].nil? ? @station.description : attr[:station_description]
    self[:address_url] =  attr[:address_url].nil? ? @address.url : attr[:address_url]
    self[:address_priority] = attr[:address_priority].nil? ? @address.priority : attr[:address_priority]
    self[:address_is_active] = attr[:address_is_active].nil? ? @address.is_active : attr[:address_is_active]
 else
   super(attr)
 end
end

def persisted?
    @station.nil? ? false : @station.persisted?
end

def id
   @station.nil? ? nil : @station.id
end

def save
    if valid?
        persist
        true
    else
        false
    end
end

def update
    if valid?
        update_form
        true
    else
        false
    end
end

private

 def persist
    @station = Station.create(name: station_name,description: station_description)
    @address = @station.addresses.create(url: address_url,is_active: address_is_active)
 end

 def update_form
    @station.update_attributes(
        :name => self[:station_name],:description => self[:station_description]
        )
    @address.update_attributes(
        :url => self[:address_url],:priority => self[:address_priority],:is_active=> self[:address_is_active]
        )
 end
end

和控制器会像

def new
 @station = StationForm.new
end

def edit
 @station = StationForm.new("id" => params[:id])
end

def create
  @station = StationForm.new(station_params)

 respond_to do |format|
   if @station.save
     format.html { redirect_to  stations_path,notice: 'Station was  successfully created.' }
     format.json { render :show,status: :created,location: @station }
   else
     format.html { render :new }
     format.json { render json: @station.errors,status: :unprocessable_entity  }
    end
 end
end

def update
 @station = StationForm.new(station_params.merge("id" => params[:id]))
 respond_to do |format|
   if @station.update
     format.html { redirect_to stations_path,notice: 'Station was  successfully updated.' }
     format.json { render :show,status: :ok,location: @station }
   else
     format.html { render :edit }
     format.json { render json: @station.errors,status: :unprocessable_entity  }
   end
 end
end

使用_form.html.erb中StationForm的“persisted”和“id”方法

<%= form_for(@station,:url => @station.persisted? ? station_path(@station.id) : stations_path,:method => @station.persisted? ? "put": "post") do |f| %>
  <% if @station.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@station.errors.count,"error") %> prohibited this station from being saved:</h2>

      <ul>
      <% @station.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :station_name %><br>
    <%= f.text_field :station_name %>
  </div>
  <div class="field">
    <%= f.label :station_description %><br>
    <%= f.text_field :station_description %>
  </div>
  <div class="field">
    <%= f.label :address_url%><br>
    <%= f.text_field :address_url %>
  </div>
  <div class="field">
    <%= f.label :address_priority%><br>
    <%= f.text_field :address_priority%>
  </div>
  <div class="field">
    <%= f.label :address_is_active %><br>
    <%= f.text_field :address_is_active %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读