我一直在修补这个问题已经有一段时间了,似乎无法解决这个问题。这可能很简单,但是这里有:
我在'层压'和'标准'之间有一个has_many:trough关系,加上模型'标准化'。
Standard.rb
class Standard < ActiveRecord::Base
attr_accessible :description, :name
has_many :standardizations
has_many :laminates, :through => :standardizations
end
Standardization.rb
class Standardization < ActiveRecord::Base
attr_accessible :laminate_id, :standard_id
belongs_to :laminate
belongs_to :standard
end
Laminate.rb
class Laminate < ActiveRecord::Base
attr_accessible :name, :standard_ids
has_many :standardizations
has_many :standards, :through => :standardizations
end
场景是层压板可以属于多个标准,我已经在视图的新部分中工作了所有东西 - 复选框和所有东西。我的问题是在尝试显示给定层压板的相应标准的名称时。截至目前,我能够显示层压板所分配的标准,但不仅仅是标准的名称。
我的show.html.erb说:
<%= @laminate.standards %>
这会使一切正确,但是说
<%= @laminate.standards.name %>
......不起作用。 我怎样才能点击每个人的名字,分配标准?
Laminate_controller:
class LaminatesController < ApplicationController
# GET /laminates
# GET /laminates.json
def index
@laminates = Laminate.all
@standards = Standard.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @laminates }
end
end
# GET /laminates/1
# GET /laminates/1.json
def show
@laminate = Laminate.find(params[:id])
@standard = Standard.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @laminate }
end
end
# GET /laminates/new
# GET /laminates/new.json
def new
@laminate = Laminate.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @laminate }
end
end
# GET /laminates/1/edit
def edit
@laminate = Laminate.find(params[:id])
end
# POST /laminates
# POST /laminates.json
def create
@laminate = Laminate.new(params[:laminate])
respond_to do |format|
if @laminate.save
format.html { redirect_to @laminate, notice: 'Laminate was successfully created.' }
format.json { render json: @laminate, status: :created, location: @laminate }
else
format.html { render action: "new" }
format.json { render json: @laminate.errors, status: :unprocessable_entity }
end
end
end
# PUT /laminates/1
# PUT /laminates/1.json
def update
@laminate = Laminate.find(params[:id])
respond_to do |format|
if @laminate.update_attributes(params[:laminate])
format.html { redirect_to @laminate, notice: 'Laminate was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @laminate.errors, status: :unprocessable_entity }
end
end
end
# DELETE /laminates/1
# DELETE /laminates/1.json
def destroy
@laminate = Laminate.find(params[:id])
@laminate.destroy
respond_to do |format|
format.html { redirect_to laminates_url }
format.json { head :no_content }
end
end
end
答案 0 :(得分:5)
以下@laminate.standards
返回标准列表。这里的呼叫名称不起作用,您应该在列表上执行每个循环:
# replace the following:
<%= @laminate.standards.name %>
# with this code:
<% @laminate.standards.each do |standard| %>
<%= standard.name %>
<% end %>
如果您想要更短版本但可定制更少:
<%= @laminate.standards.map{ |standard| standard.name }.join(', ') %>
# This will show all the standards' name with a coma-space ',' between it
# same a above but shorter:
<%= @laminate.standards.map(&:name).join(', ') %>
# this will call the 'name' method on each standard of @laminate.standards
# and join them with a coma-space
# something that would look like this:
# name1, name2, name3