【问题标题】:Creating belongs_to and has_many routes, controllers, and views?创建belongs_to 和has_many 路由、控制器和视图?
【发布时间】:2014-07-17 14:02:19
【问题描述】:

我正在创建一个项目,允许用户登录并在登录后推荐其他用户。用户有_many 推荐和推荐属于_to 用户。我想要一个页面,一旦当前用户登录,他们可以输入带有参数的推荐:名称和推荐电子邮件。但这是一个协作项目,设置用户身份验证的人使用了设计。目前,我收到以下错误:

undefined method `resource' for #<ReferralsController:0x007fb75735aa00>

用户控制器:

class UsersController < ApplicationController
  def new
  end

结束

推荐控制器:

class ReferralsController < ApplicationController

def new
    @referral = Referral.new
end

def create

    @referral = current_user.referrals.new(referral_params)

    if @referral.save
        redirect_to @referral
    else
        render 'new'
    end
end

def show
    @referrals = current_user.find_by_user_id(params[:user_id]).referrals.all
end

def index
  @referrals = current_user.referrals.all
end

def edit
    @referral = Referral.find(params[:id])
end

def update
  @referral = Referral.find(params[:id])

  if @referral.update(referral_params)
    redirect_to @referral
  else
    render 'edit'
  end
end

def destroy
  @referral = Referral.find(params[:id])
  @referral.destroy

  redirect_to referral_path
end

private
  def referral_params
    params.require(:referral).permit(:name, :email, :user_id)
  end

end

用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
      has_many :referrals
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  include RoleModel

#  attr_accessible :email, :password, :password_confirmation, :school_name, :sport, :roles, :roles_mask

  roles_attribute :roles_mask

  roles :admin, :coach, :guest



end

推荐模型

class Referral < ActiveRecord::Base
    belongs_to :user
end

用户视图:

<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, autofocus: true %></div>

  <div><%= f.label :school_name %><br />
  <%= f.text_field :school_name %></div>

  <div><%= f.label :sport %><br />
  <%= f.text_field :sport %></div>

  <div><%= f.label :password %><br />
    <%= f.password_field :password, autocomplete: "off" %></div>

  <div><%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %></div>

  <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render "devise/shared/links" %>

推荐视图:

<h2>Refer a coach </h2>

<%= form_for ([current_user, @referral]), :html => { :mulitpart => true } do |f| %>

  <%= devise_error_messages! %>

   <div><%= f.label :referral %><br />
  <%= f.text_field :referral %></div>

  <div><%= f.label :referral_email %><br />
  <%= f.email_field :referral, autofocus: true %></div>


  <div><%= f.submit "Refer This Coach" %></div>
<% end %>

路线:

  Blog::Application.routes.draw do

  devise_for :users

  resources :users do
      resources :referrals
  end

  get 'sessions/new'

  get 'users/new'




  resources :articles do
    resources :comments
  end

  root 'welcome#index'
end

【问题讨论】:

  • 删除 'referrals' 作为 'users' 下的嵌套路由。由于它始终适用于当前用户,因此它应该是一个简单的资源 - 不是嵌套的。此外,您的推荐人#show 操作逻辑有问题,您可能需要查看一下。

标签: ruby-on-rails devise routes user-defined-functions has-and-belongs-to-many


【解决方案1】:

问题来自您推荐视图中的devise_error_messages! - 将其删除。只有user 资源被设置为与设计一起使用,没有别的。

如 cmets 中所述,您应该重新考虑将引荐作为用户下的嵌套资源 - 以您使用它的方式这样做并没有任何优势,而且有很大的出错空间。保持简单!

【讨论】:

  • 谢谢!但现在我在新的推荐视图中得到了 #<0x007fccce869a78>
  • &lt;&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2016-03-02
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
相关资源
最近更新 更多