在我的主页上有一个帐户创建(用户)表单,一个设计(设计)提交表单,我试图在同一页面上添加一个部分,用户可以查看活动设计并对它们进行投票。我在添加该部分到页面时遇到了问题,因为我认为是提交表单——以下是相关文件:
着陆控制器(主页控制器)
class LandingController < ApplicationController
def index
@email = Email.new
@design = Design.all
@user = User.new
end
end
- 当我将@design改为
Design.new
时,它适用于提交而不是视图。
designs-controller
class DesignsController < ApplicationController
protect_from_forgery with: :exception
before_filter :admin_user, only: [:show ,:edit, :update, :destroy]
def show
@design = Design.find(params[:id])
end
def edit
@design = Design.find(params[:id])
end
def new
@design = Design.new
end
def create
@design = Design.new(design_params)
respond_to do |format|
if @design.save
format.html { redirect_to root_path, notice: 'Thank You For Your Submission!' }
format.json { render json: Design.create(design_params) }
else
@user = User.new
format.html { render "landing/index" }
format.json { render :json => @design.errors, :status => :unprocessable_entity }
end
end
end
def update
@design = Design.find(params[:id])
if @design.update(design_params)
redirect_to '/cpanel'
else
render 'edit'
end
end
def destroy
@design = Design.find(params[:id])
@design.destroy
redirect_to '/cpanel'
end
private
def design_params
params.require(:design).permit(:dfirstname, :dlastname, :demail, :rcode, :frontview, :sideview, :backview, :category, :active)
end
def admin_user
redirect_to(root_path) unless current_user && current_user.admin?
end
end
然后我在着陆视图中有这个:
<% @design.each do |design| %>
<% if design.active %>
<%= image_tag design.frontview, :class => 'design-image' %>
<% else %>
<% end %>
<% end %>
和下面这个
<%= form_for @design.new, url: designs_path, html: {class: "design-form", :multipart => true} do |f| %>
<h2>Design Submission</h2>
<% if @design.new.errors.any? %>
<ul>
<% @design.errors.full_messages.each do |message| %>
<li class="e-message">- <%= message %></li>
<% end %>
</ul>
<% end %>
... form ...
<% end %>
基本上让这些工作在一起,因为现在它会加载页面,但然后给我一个错误信息,当我试图提交表单。具体错误信息为着陆索引页undefined method each
不能在定义为@design = Design.all
的form
中使用@design
。您应该将@design = Design.all
更改为@designs = Design.all
,并在索引方法
@design = Design.new
class LandingController < ApplicationController
def index
@email = Email.new
@designs = Design.all
@design = Design.new
@user = User.new
end
end
和
<% @design.each do |design| %>
<% @designs.each do |design| %>
和
<%= form_for @design.new, url: designs_path, html: {class: "design-form", :multipart => true} do |f| %>
<%= form_for @design, url: designs_path, html: {class: "design-form", :multipart => true} do |f| %>
更新:
根据我们的讨论和design_controller.rb
的代码,在else
块的create
方法中,你应该有@designs = Design.all
,因为如果创建失败,你正在用这个代码format.html { render "landing/index" }
渲染index.html.erb
,所以Rails不知道在这种情况下@designs
来自哪里。
def create
@design = Design.new(design_params)
respond_to do |format|
if @design.save
format.html { redirect_to root_path, notice: 'Thank You For Your Submission!' }
format.json { render json: Design.create(design_params) }
else
@user = User.new
@designs = Design.all
format.html { render "landing/index" }
format.json { render :json => @design.errors, :status => :unprocessable_entity }
end
end
end