我是Rails的新手,我陷入了一些非常愚蠢的事情。我试图制作一个用户可以发布类似pinterest的应用程序的应用程序,所以我选择了用户has_many:pin和pin belongs_to:user。这里是几个文件中的代码,只是为了让您了解我现在所处的状态:
应用程序/模型/ user.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :pins
end
应用程序/模型/ pin.rb
class Pin < ActiveRecord::Base
belongs_to :user
end
pins_controller.rb
class PinsController < ApplicationController
before_action :find_pin, only: [:show, :edit, :update, :destroy]
def index
@pins = Pin.all.order("created_at DESC")
end
def show
end
def new
@pin = current_user.pins.build
end
def create
@pin = current_user.pins.build(pin_params)
if @pin.save
redirect_to @pin, notice: "Successfully created new Pin"
else
render 'new'
end
end
def edit
end
def update
if @pin.update(pin_params)
redirect_to @pin, notice: "Pin was successfully updated!"
else
render 'edit'
end
end
def destroy
@pin.destroy
redirect_to root_path
end
def error
end
private
def pin_params
params.require(:pin).permit(:title, :description)
end
def find_pin
@pin = Pin.find(params[:id])
end
end
/views/pins/show.html.haml
%h1= @pin.title
%p= @pin.description
%p
%hr
%strong Submitted by
= @pin.user.email
这里,在show.html.haml的最后一行,我希望@ pin.user.email是一个链接,以便
点击广告时,可以访问用户的个人资料(提交文章的人)。
用户的个人资料应列出他/她提交的所有文章。
这些是我想要完成的两件事但却不知道我应该使用的代码。我没有users_controller。我确实有一个但是在它开始搞乱设计路线之后我删除了它。欢迎所有答案,提前谢谢!
答案 0 :(得分:0)
您忘了定义show方法
import java.io.InputStream;
import java.net.URL;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Zoom implements PaintListener, MouseMoveListener, MouseListener {
private static final int MOUSE_DOWN = 1;
private static final int DRAGGING = 2;
private static final int NOT_DRAGGING = 3;
int dragState = NOT_DRAGGING;
Point zoomStart;
Point zoomEnd;
ImageData imgData;
Image img;
Transform paintTransform;
Shell shell;
Color rectColor;
public Zoom(ImageData image, Shell shell) {
imgData = image;
img = new Image(shell.getDisplay(), image);
this.shell = shell;
rectColor = new Color(shell.getDisplay(), new RGB(255, 255, 255));
}
void zoom() {
int x0 = Math.min(zoomStart.x, zoomEnd.x);
int x1 = Math.max(zoomStart.x, zoomEnd.x);
int y0 = Math.min(zoomStart.y, zoomEnd.y);
int y1 = Math.max(zoomStart.y, zoomEnd.y);
setVisibleImageAreaInScreenCoordinates(x0, y0, x1, y1);
}
void setVisibleImageAreaInImageCoordinates(float x0, float y0,
float x1, float y1) {
Point sz = shell.getSize();
double width = x1 - x0;
double height = y1 - y0;
double sx = (double) sz.x / (double) width;
double sy = (double) sz.y / (double) height;
float scale = (float) Math.min(sx, sy);
// compute offset to center selected rectangle in available area
double ox = 0.5 * (sz.x - scale * width);
double oy = 0.5 * (sz.y - scale * height);
paintTransform.identity();
paintTransform.translate((float) ox, (float) oy);
paintTransform.scale(scale, scale);
paintTransform.translate(-x0, -y0);
}
void setVisibleImageAreaInScreenCoordinates(int x0, int y0,
int x1, int y1) {
Transform inv = invertPaintTransform();
// points in screen coordinates
// to be transformed to image coordinates
// (top-left and bottom-right corner of selection)
float[] points = { x0, y0, x1, y1 };
// actually get image coordinates
// (in-place operation on points array)
inv.transform(points);
inv.dispose();
// extract image coordinates from array
float ix0 = points[0];
float iy0 = points[1];
float ix1 = points[2];
float iy1 = points[3];
setVisibleImageAreaInImageCoordinates(ix0, iy0, ix1, iy1);
}
Transform invertPaintTransform() {
// clone paintTransform
float[] elems = new float[6];
paintTransform.getElements(elems);
Transform inv = new Transform(shell.getDisplay());
inv.setElements(elems[0], elems[1], elems[2],
elems[3], elems[4], elems[5]);
// invert clone
inv.invert();
return inv;
}
void fitImage() {
Point sz = shell.getSize();
double sx = (double) sz.x / (double) imgData.width;
double sy = (double) sz.y / (double) imgData.height;
float scale = (float) Math.min(sx, sy);
paintTransform.identity();
paintTransform.translate(sz.x * 0.5f, sz.y * 0.5f);
paintTransform.scale(scale, scale);
paintTransform.translate(-imgData.width*0.5f, -imgData.height*0.5f);
}
@Override
public void paintControl(PaintEvent ev) {
if (paintTransform == null) {
paintTransform = new Transform(shell.getDisplay());
fitImage();
}
ev.gc.setTransform(paintTransform);
ev.gc.drawImage(img, 0, 0);
if (dragState == DRAGGING) {
drawZoomRect(ev.gc);
}
}
void drawZoomRect(GC gc) {
int x0 = Math.min(zoomStart.x, zoomEnd.x);
int x1 = Math.max(zoomStart.x, zoomEnd.x);
int y0 = Math.min(zoomStart.y, zoomEnd.y);
int y1 = Math.max(zoomStart.y, zoomEnd.y);
gc.setTransform(null);
gc.setAlpha(0x80);
gc.setForeground(rectColor);
gc.fillRectangle(x0, y0, x1 - x0, y1 - y0);
}
public static void main(String[] args) throws Exception {
URL url = new URL(
"https://upload.wikimedia.org/wikipedia/commons/thumb/" +
"6/62/Billy_Zoom.jpg/800px-Billy_Zoom.jpg");
InputStream input = url.openStream();
ImageData img;
try {
img = new ImageData(input);
} finally {
input.close();
}
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(800, 600);
Zoom zoom = new Zoom(img, shell);
shell.open();
shell.addPaintListener(zoom);
shell.addMouseMoveListener(zoom);
shell.addMouseListener(zoom);
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
@Override
public void mouseDoubleClick(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
if (e.button != 1) {
return;
}
zoomStart = new Point(e.x, e.y);
dragState = MOUSE_DOWN;
}
@Override
public void mouseUp(MouseEvent e) {
if (e.button != 1) {
return;
}
if (dragState == DRAGGING) {
zoomEnd = new Point(e.x, e.y);
}
dragState = NOT_DRAGGING;
zoom();
shell.redraw();
}
@Override
public void mouseMove(MouseEvent e) {
if (dragState == NOT_DRAGGING) {
return;
}
if (e.x == zoomStart.x && e.y == zoomStart.y) {
dragState = MOUSE_DOWN;
} else {
dragState = DRAGGING;
zoomEnd = new Point(e.x, e.y);
}
shell.redraw();
}
}
答案 1 :(得分:0)
首先创建用户控制器。 将显示页面行重定向到用户显示操作 然后你执行你想要的。
对于前。
link_to“用户个人资料”,user_path(@ pin.user.id)
users_controller.rb
类UsersController&lt; ApplicationController中
def show @user = User.find_by_id(params [:id]) @pins = @ user.pins 结束 端/views/users/show.html.haml 用户@user和@pins显示您想要的内容。