Ruby on rails RubyOnRails3中的单一模型不同视图和CRUD功能

Ruby on rails RubyOnRails3中的单一模型不同视图和CRUD功能,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,作为RubyonRails的新手,我偶然发现了我应用程序的一部分。我阅读了RoR框架的基础知识,了解rails MVC的“约定优先于配置”特性。我有两个表,一个是apps\u events,另一个是apps\u events\u attributes。第一个的id是第二个的外键,在中有许多关系。app_events表有一个外键属性“app_id”字段,因此在特定app上选择I将重定向到其事件和属性。还有一个名为“is_standard”的字段,它实际上区分事件类型是标准事件还是自定义事件 现在,

作为RubyonRails的新手,我偶然发现了我应用程序的一部分。我阅读了RoR框架的基础知识,了解rails MVC的“约定优先于配置”特性。我有两个表,一个是apps\u events,另一个是apps\u events\u attributes。第一个的id是第二个的外键,在中有许多关系。app_events表有一个外键属性“app_id”字段,因此在特定app上选择I将重定向到其事件和属性。还有一个名为“is_standard”的字段,它实际上区分事件类型是标准事件还是自定义事件

现在,我必须在视图层上的两个不同选项卡中渲染特定应用程序的事件及其属性,并使用嵌套的表单作为其属性。用户可以通过此选项卡单击切换到标准和自定义事件。有谁能建议我如何实现相同的目标,并向我展示此场景的理想流程(模型名称和“is_standard”的检查部分,在控制器中传播相同的内容并渲染到视图)


顺便问一下,我可以在同一个模型上使用不同的控制器吗?如果我使用相同的控制器,那么它能够为不同的事件及其属性执行相同的CRUD功能吗?

我已经单独完成了所有的工作,并且这不是我最初认为的很难,所有的技巧都是由JQuery完成的。。。如果有人和我有同样的问题,我会和你分享这个想法

我的型号是

class AppsEvent < ActiveRecord::Base
  belongs_to :app
  has_many :apps_events_attributes, :foreign_key => 'apps_event_id',
       :class_name => 'AppsEventsAttribute',
       :dependent => :destroy
  accepts_nested_attributes_for :apps_events_attributes,
                            :reject_if => lambda { |a| (a[:name].blank? &&    a[:description].blank?) },
                            :allow_destroy => true
  validates_presence_of :description
  validates_presence_of :name
  validates_presence_of :code
  validates_presence_of :apps_events_attributes, :message => "can't be empty"
end  
class-AppsEvent“apps\u event\u id”,
:class_name=>“AppsEventsAttribute”,
:dependent=>:destroy
接受应用程序、事件和属性的嵌套属性,
:reject_if=>lambda{a |(a[:name].blank?&&a[:description].blank?},
:allow_destroy=>true
验证是否存在:说明
验证是否存在:name
验证是否存在:代码
验证是否存在:应用程序\u事件\u属性,:message=>“不能为空”
结束

类AppsEventsAttribute“apps\u event\u id” 属性可访问:id、:apps\u event\u id、:name、:description、:attribute\u type、:is\u std、:created\u at、:updated\u at def类型 self.attribute\u类型 结束 结束 我的控制器是

class AppsEventsController < ApplicationController
  layout :layout_by_resource
  before_filter :initialize_default_app
  before_filter :check_permission
  before_filter :load

  def load
    @app = current_user.find_app(params[:app_id])
    @apps_events = AppsEvent.where(:app_id => @app.id)
    @apps_event = AppsEvent.new
  end

  def index
    @app = current_user.find_app(params[:app_id])
    @default_app = App.default(current_user)
    @apps_events = AppsEvent.where(:app_id => @app.id)
    @apps_event_jsons = Hash.new
    @apps_events.each do |app_event|
      json = Hash.new
      json['User_ID'] = 548741213
      json['Session_ID'] = 2568639390
      json['Action_Type'] = app_event.code
      json['eventsData'] = {}

      app_event.apps_events_attributes.each do |apps_event_attributes|
        if (apps_event_attributes.attribute_type == 'Integer')
          json['eventsData'][apps_event_attributes.name] = 1234
        elsif (apps_event_attributes.attribute_type == 'Float')
          json['eventsData'][apps_event_attributes.name] = 1234.23
        else
          json['eventsData'][apps_event_attributes.name] = 'abcd'
        end
      end

      @apps_event_jsons[app_event.id] = json
    end
  end

  def new
    @apps_event = AppsEvent.new
    @app = current_user.find_app(params[:app_id])
    @apps_event.app_id = @app.id
    @apps_event.apps_events_attributes.build
    @action = 'create'
    render 'edit'
  end

  def edit
    @app = current_user.find_app(params[:app_id])
    @apps_event = AppsEvent.find(params[:id])
    @action = 'update'
  end

  def create
    @apps_event = AppsEvent.new(params[:apps_event])
    @show_custom_event = 'true'
    @apps_event.name = @apps_event.name.strip
    respond_to do |format|
      if @apps_event.save
        format.html {
          redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :notice => "Successfully created #{@apps_event.name} custom definition.")
        }
        format.js {
          flash[:notice] = 'Successfully created event.'
          @apps_events = AppsEvent.where(:app_id => @app.id)
        }
      else
        @app = current_user.find_app(params[:app_id])

        if (@apps_event.apps_events_attributes == nil ||   @apps_event.apps_events_attributes.size <= 0)
          @apps_event.apps_events_attributes.build
        end

        @apps_event.populate_code
        @action = 'create'
        format.html {
          redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :alert => "Error in creating #{@apps_event.name} custom definition.")
        }
        format.js
      end
    end
  end

  def update
    @apps_event = AppsEvent.find(params[:apps_event][:id])
    params[:apps_event][:name] = params[:apps_event][:name].strip

    respond_to do |format|
      if @apps_event.update_attributes(params[:apps_event])
        format.html {
          if(@apps_event.is_std == 'y')
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :notice => "Successfully updated #{@apps_event.name} standard definition.")
          else
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                    :notice => "Successfully updated #{@apps_event.name} custom definition.")
          end
        }
        format.js {
          flash[:notice] = 'Successfully updated event.'
          @apps_events = AppsEvent.where(:app_id => @app.id)
          render :nothing => true
        }
      else
        @app = current_user.find_app(params[:app_id])

        if (@apps_event.apps_events_attributes == nil || @apps_event.apps_events_attributes.size <= 0)
          @apps_event.apps_events_attributes.build
        end

        @apps_event.populate_code
        @action = "update"
        format.html {
          if(@apps_event.is_std == 'y')
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :alert => "Error in updating #{@apps_event.name} standard definition.")
          else
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                    :alert => "Error in updating #{@apps_event.name} custom definition.")
          end
        }
        format.js
      end
    end
  end

  def delete
    if AppsEvent.delete(params[:id])
      redirect_to "/app/#{params[:app_id]}/apps_events", :notice => "Successfully deleted #{@apps_event.name} custom definition."
    else
      redirect_to "/app/#{params[:app_id]}/apps_events",
              :alert => "Error in deleting #{@apps_event.name} custom definition."
    end
  end
end  
class AppsEventsController@app.id)
@apps\u event=AppsEvent.new
结束
def索引
@app=当前用户。查找app(参数[:app\u id])
@default\u app=app.default(当前用户)
@apps\u events=AppsEvent.where(:app\u id=>@app.id)
@apps\u event\u jsons=Hash.new
@apps_事件。每个do| app_事件|
json=Hash.new
json['User_ID']=548741213
json['Session_ID']=2568639390
json['Action_Type']=app_event.code
json['eventsData']={}
app_event.apps_events_attributes.each do| apps_event_attributes|
如果(应用程序\u事件\u属性.attributes\u类型=='Integer')
json['eventsData'][apps\u event\u attributes.name]=1234
elsif(应用程序\u事件\u属性.attribute\u类型=='Float')
json['eventsData'][apps\u event\u attributes.name]=1234.23
其他的
json['eventsData'][apps\u event\u attributes.name]=“abcd”
结束
结束
@apps\u event\u jsons[app\u event.id]=json
结束
结束
def新
@apps\u event=AppsEvent.new
@app=当前用户。查找app(参数[:app\u id])
@apps\u event.app\u id=@app.id
@apps\u event.apps\u events\u attributes.build
@操作='create'
渲染“编辑”
结束
定义编辑
@app=当前用户。查找app(参数[:app\u id])
@apps\u event=AppsEvent.find(参数[:id])
@操作='更新'
结束
def创建
@apps\u event=AppsEvent.new(参数[:apps\u event])
@显示自定义事件='true'
@apps\u event.name=@apps\u event.name.strip
回应待办事项|格式|
如果@apps\u event.save
format.html{
将_重定向到(“/app/#{params[:apps_event][:app_id]}/apps_events”,
:notice=>“已成功创建#{@apps_event.name}自定义定义。”)
}
format.js{
flash[:notice]=“已成功创建事件。”
@apps\u events=AppsEvent.where(:app\u id=>@app.id)
}
其他的
@app=当前用户。查找app(参数[:app\u id])
if(@apps_event.apps_events_attributes==nil | |@apps_event.apps_events_attributes.size“创建#{@apps_event.name}自定义定义时出错”)
}
format.js
结束
结束
结束
def更新
@apps\u event=AppsEvent.find(参数[:apps\u event][:id])
params[:apps\u event][:name]=params[:apps\u event][:name].strip
回应待办事项|格式|
如果@apps\u event.update\u属性(参数[:apps\u event])
format.html{
如果(@apps\u event.is\u std=='y')
将_重定向到(“/app/#{params[:apps_event][:app_id]}/apps_events”,
:notice=>“已成功更新#{@apps_event.name}标准定义。”)
其他的
将_重定向到(“/app/#{params[:apps_event][:app_id]}/apps_events”,
:notice=>“已成功更新#{@apps_event.name}自定义定义。”)
结束
}
format.js{
flash[:notice]=“已成功更新事件。”
@apps\u events=AppsEvent.where(:app\u id=>@app.id)
render:nothing=>true
}
其他的
@app=当前用户。查找app(参数[:app\u id])
如果(@apps_event.apps_events_attributes==nil | |@apps_event.apps_events_attributes.size)在更新#{@apps_event.name}标准时出错
class AppsEventsController < ApplicationController
  layout :layout_by_resource
  before_filter :initialize_default_app
  before_filter :check_permission
  before_filter :load

  def load
    @app = current_user.find_app(params[:app_id])
    @apps_events = AppsEvent.where(:app_id => @app.id)
    @apps_event = AppsEvent.new
  end

  def index
    @app = current_user.find_app(params[:app_id])
    @default_app = App.default(current_user)
    @apps_events = AppsEvent.where(:app_id => @app.id)
    @apps_event_jsons = Hash.new
    @apps_events.each do |app_event|
      json = Hash.new
      json['User_ID'] = 548741213
      json['Session_ID'] = 2568639390
      json['Action_Type'] = app_event.code
      json['eventsData'] = {}

      app_event.apps_events_attributes.each do |apps_event_attributes|
        if (apps_event_attributes.attribute_type == 'Integer')
          json['eventsData'][apps_event_attributes.name] = 1234
        elsif (apps_event_attributes.attribute_type == 'Float')
          json['eventsData'][apps_event_attributes.name] = 1234.23
        else
          json['eventsData'][apps_event_attributes.name] = 'abcd'
        end
      end

      @apps_event_jsons[app_event.id] = json
    end
  end

  def new
    @apps_event = AppsEvent.new
    @app = current_user.find_app(params[:app_id])
    @apps_event.app_id = @app.id
    @apps_event.apps_events_attributes.build
    @action = 'create'
    render 'edit'
  end

  def edit
    @app = current_user.find_app(params[:app_id])
    @apps_event = AppsEvent.find(params[:id])
    @action = 'update'
  end

  def create
    @apps_event = AppsEvent.new(params[:apps_event])
    @show_custom_event = 'true'
    @apps_event.name = @apps_event.name.strip
    respond_to do |format|
      if @apps_event.save
        format.html {
          redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :notice => "Successfully created #{@apps_event.name} custom definition.")
        }
        format.js {
          flash[:notice] = 'Successfully created event.'
          @apps_events = AppsEvent.where(:app_id => @app.id)
        }
      else
        @app = current_user.find_app(params[:app_id])

        if (@apps_event.apps_events_attributes == nil ||   @apps_event.apps_events_attributes.size <= 0)
          @apps_event.apps_events_attributes.build
        end

        @apps_event.populate_code
        @action = 'create'
        format.html {
          redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :alert => "Error in creating #{@apps_event.name} custom definition.")
        }
        format.js
      end
    end
  end

  def update
    @apps_event = AppsEvent.find(params[:apps_event][:id])
    params[:apps_event][:name] = params[:apps_event][:name].strip

    respond_to do |format|
      if @apps_event.update_attributes(params[:apps_event])
        format.html {
          if(@apps_event.is_std == 'y')
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :notice => "Successfully updated #{@apps_event.name} standard definition.")
          else
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                    :notice => "Successfully updated #{@apps_event.name} custom definition.")
          end
        }
        format.js {
          flash[:notice] = 'Successfully updated event.'
          @apps_events = AppsEvent.where(:app_id => @app.id)
          render :nothing => true
        }
      else
        @app = current_user.find_app(params[:app_id])

        if (@apps_event.apps_events_attributes == nil || @apps_event.apps_events_attributes.size <= 0)
          @apps_event.apps_events_attributes.build
        end

        @apps_event.populate_code
        @action = "update"
        format.html {
          if(@apps_event.is_std == 'y')
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                  :alert => "Error in updating #{@apps_event.name} standard definition.")
          else
            redirect_to("/app/#{params[:apps_event][:app_id]}/apps_events",
                    :alert => "Error in updating #{@apps_event.name} custom definition.")
          end
        }
        format.js
      end
    end
  end

  def delete
    if AppsEvent.delete(params[:id])
      redirect_to "/app/#{params[:app_id]}/apps_events", :notice => "Successfully deleted #{@apps_event.name} custom definition."
    else
      redirect_to "/app/#{params[:app_id]}/apps_events",
              :alert => "Error in deleting #{@apps_event.name} custom definition."
    end
  end
end  
<% for apps_event in @apps_events %>
  <% if (apps_event.is_std == 'y') %>
    <div class="standardEvent showStandard">
      <ul>
        <li class="column_1"><span style="font-weight: bold;"><%= apps_event.name %></span></li>
        <li class="column_2"><span><%= apps_event.code %></span></li>
        <li class="column_3"><span><%= apps_event.description %></span></li>
        <li class="column_4">
          <%= link_to edit_apps_event(apps_event) %>
        </li>
        <li class="column_5">

        </li>
      </ul>
    </div>
  <% else %>
    <div class="customEvent showCustom" style="display:none">
      <ul>
        <li class="column_1"><span style="font-weight: bold;"><%= apps_event.name %></span></li>
        <li class="column_2"><span><%= apps_event.code %></span></li>
        <li class="column_3"><span><%= apps_event.description %></span></li>
        <li class="column_4">
          <%= link_to edit_apps_event(apps_event) %>
        </li>
        <li class="column_5">
          <%= remove_apps_event_prompt_link(apps_event) %>
        </li>
      </ul>
    </div>
  <% end %>
  <div class="clrBoth"></div>
<% end %>