Ruby on rails RubyOnRails3中的单一模型不同视图和CRUD功能
作为RubyonRails的新手,我偶然发现了我应用程序的一部分。我阅读了RoR框架的基础知识,了解rails MVC的“约定优先于配置”特性。我有两个表,一个是apps\u events,另一个是apps\u events\u attributes。第一个的id是第二个的外键,在中有许多关系。app_events表有一个外键属性“app_id”字段,因此在特定app上选择I将重定向到其事件和属性。还有一个名为“is_standard”的字段,它实际上区分事件类型是标准事件还是自定义事件 现在,我必须在视图层上的两个不同选项卡中渲染特定应用程序的事件及其属性,并使用嵌套的表单作为其属性。用户可以通过此选项卡单击切换到标准和自定义事件。有谁能建议我如何实现相同的目标,并向我展示此场景的理想流程(模型名称和“is_standard”的检查部分,在控制器中传播相同的内容并渲染到视图)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”的字段,它实际上区分事件类型是标准事件还是自定义事件 现在,
顺便问一下,我可以在同一个模型上使用不同的控制器吗?如果我使用相同的控制器,那么它能够为不同的事件及其属性执行相同的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=>“不能为空”
结束
及
类AppsEventsAttributeclass 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 %>