Mik*_*keH 11 controller ruby-on-rails
请参阅问题底部的更新...
作为参考,这个问题是根据我在此处遇到的先前问题所做的一些修复而演变而来的:在Rails中关联两个模型(用户和配置文件)
我正在构建一个具有用户模型和配置文件模型的应用程序.
我想将这些模型关联起来:
- 在用户创建帐户后,他会自动发送到"创建配置文件"页面,并且他创建的配置文件仅连接到该特定用户.
- 只有拥有该配置文件的用户才能对其进行编辑.
我使用nifty_generators生成了用户模型.当用户点击提交创建帐户时,我会将其重定向到"新配置文件"视图以创建配置文件.我是通过编辑用户控制器中的重定向路径来完成的.用户控制器如下所示:
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
session[:user_id] = @user.id
flash[:notice] = "Thank you for signing up! You are now logged in."
redirect_to new_user_profile_path(:user_id => @user)
else
render :action => 'new'
end
end
Run Code Online (Sandbox Code Playgroud)
当我点击"提交"以创建新用户时,它现在将我发送到以下网址,这似乎是正确的:localhost:3000/users/6/profile/new.但它抛出以下异常:
ProfilesController中的NoMethodError #new当你没想到它时,你有一个nil对象!评估nil.build时发生错误
跟踪表明问题出在Profile方法的New方法中.配置文件控制器如下所示:
def index
@user = User.find(params[:user_id])
@profile = @user.profile(:order => "created_at DESC")
end
def show
@user = User.find(params[:user_id])
@profile = @user.profile.find(params[:id])
end
def new
@user = User.find(params[:user_id])
@profile = @user.profile.build
end
def edit
@user = User.find(params[:user_id])
@profile = @user.profile.find(params[:id])
end
def create
@user = User.find(params[:user_id])
@profile = @user.profile.build(params[:profile])
if @profile.save
flash[:notice] = 'Profile was successfully created.'
redirect_to(@profile)
else
flash[:notice] = 'Error. Something went wrong.'
render :action => "new"
end
end
Run Code Online (Sandbox Code Playgroud)
此外,当我尝试查看配置文件的索引页面时,应用程序也会抛出异常(当前没有配置文件,因为我无法通过用户创建步骤来创建配置文件).这是例外:
ProfilesController中的ActiveRecord :: RecordNotFound #index
无法找到没有ID的用户
这是日志告诉我的内容:
处理ProfilesController #index [GET]参数:{"action"=>"index","controller"=>"profiles"}
ActiveRecord :: RecordNotFound(无法找到没有ID的用户):
app/controllers/profiles_controller.rb:5:在`index'中
为了向您提供有关应用程序的其余详细信息,模型具有以下关联:
配置文件所属_to:user
用户具有_one :配置文件
我在routes.rb文件中有这个:map.resources:users,:has_one =>:profile
在新的配置文件页面的视图中抛出上面列出的第一个例外,我有这个:
<% form_for([@user, @profile]) do |f| %>
<%= f.error_messages %>
....
<% end %>
Run Code Online (Sandbox Code Playgroud)
在上面解释的抛出第二个异常的配置文件索引的视图中,我有:
<% @profiles.each do |profile| %>
<div class="post">
<div class="left">
<p>Store: </p>
<p>Category: </p>
</div>
<div class="right">
<p><%=h profile.name %></p>
<p><%=h profile.category %></p>
</div>
<div class="bottom">
<p><%= link_to 'Go to profile', user_profile_path(@user, profile) %></p>
<p><%= link_to 'Edit', edit_user_profile_path(@user, profile) %></p>
<p><%= link_to 'Destroy', user_profile_path(@user, profile), :confirm => 'Are you sure?', :method => :delete %></p>
</div>
Run Code Online (Sandbox Code Playgroud)
我花了好几个小时尝试自己追踪这个问题作为一个学习练习,但此时我不知道如何解决这个问题.感谢帮助!
jdl,根据您的要求:
profiles/new.html.erb:
<% form_for([@user, @profile]) do |f| %>
<%= f.error_messages %>
<div class="left">
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>required
</p>
<p>
<%= f.label :category %><br />
<%= f.text_field :category %>required
</p>
<p>
<%= f.label :address1 %><br />
<%= f.text_field :address1 %>
</p>
<p>
<%= f.label :address2 %><br />
<%= f.text_field :address2 %>
</p>
<p>
<%= f.label :city %><br />
<%= f.text_field :city %>
</p>
<p>
<%= f.label :state %><br />
<%= f.text_field :state %>
</p>
<p>
<%= f.label :zip %><br />
<%= f.text_field :zip %>required
</p>
<p>
<%= f.label :phone %><br />
<%= f.text_field :phone %>
</p>
<p>
<%= f.label :email %><br />
<%= f.text_field :email %>
</p>
</div>
<div class="right">
<p>
<%= f.label :website %><br />
<%= f.text_field :website %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
</div>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
Run Code Online (Sandbox Code Playgroud)
routes.rb:
ActionController :: Routing :: Routes.draw do | map |
map.signup'signup',: controller =>'users',:action =>'
new'map.logout'logout',: controller =>'sessions',:action =>'
destroy'map.login'login' ,:controller =>'sessions'
,: action =>' new'map.resources:sessions
map.resources :users, :has_one => :profile
map.root :controller => "home"
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
end
Run Code Online (Sandbox Code Playgroud)
PROFILES CONTROLLER(截至2009年8月20日,美国东部时间晚上8点)
类ProfilesController <ApplicationController
def index
@users = User.all(:order => "created_at DESC")
end
def show
@user = User.find(params[:user_id])
end
def new
@user.profile = Profile.new
end
def edit
@user = User.find(params[:user_id])
@profile = @user.profile.find(params[:id])
end
def create
@user = User.find(params[:user_id])
@profile = @user.profile.build(params[:profile])
if @profile.save
flash[:notice] = 'Profile was successfully created.'
redirect_to(@profile)
else
flash[:notice] = 'Error. Something went wrong.'
render :action => "new"
end
end
def update
@profile = Profile.find(params[:id])
if @profile.update_attributes(params[:profile])
flash[:notice] = 'Profile was successfully updated.'
redirect_to(@profile)
else
render :action => "edit"
end
end
def destroy
@profile = Profile.find(params[:id])
@profile.destroy
redirect_to(profiles_url)
end
end
Run Code Online (Sandbox Code Playgroud)
Cody,下面的索引页面抛出以下异常:
Profiles中的NoMethodError #index
显示app/views/profiles/index.html.erb,其中第14行引发:
未定义的方法`name'代表#
<div id="posts">
<% @users.each do |profile| %>
<div class="post">
<div class="left">
<p>Store: </p>
<p>Category: </p>
</div>
<div class="right">
<p><%=h profile.name %></p>
<p><%=h profile.category %></p>
</div>
<div class="bottom">
<p><%= link_to 'Go to profile', user_profile_path(@user, profile) %></p>
<p><%= link_to 'Edit', edit_user_profile_path(@user, profile) %></p>
<p><%= link_to 'Destroy', user_profile_path(@user, profile), :confirm => 'Are you sure?', :method => :delete %></p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
错误告诉你在这一行:
@profile = @user.profile.build
Run Code Online (Sandbox Code Playgroud)
@ user.profile是零.
由于您还没有创建配置文件,这是有道理的.相反,去做这样的事情.
@profile = Profile.new(:user_id => @user.id)
Run Code Online (Sandbox Code Playgroud)
Re:抛出异常的索引页面.
您正在控制器中定义@users,然后在路径助手中引用@user.另外,迭代@users应该给你User对象,而不是Profile对象.
看起来您正在尝试使用Profile#index操作来显示用户列表.这种方式很好,以一种不太纯粹的REST方式.但是,我希望看到更像这样的东西.
<% @users.each do |user| -%>
<% unless user.profile.blank? -%>
<%= h user.profile.name %>
<%= h user.profile.category %>
<%= link_to 'Go to profile', user_profile_path(user, user.profile) %>
<% end -%>
<% end -%>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34096 次 |
| 最近记录: |