我目前正在编写代码,为每个登录我的应用程序的用户构建一个配置文件页面。但是我花了很多时间,似乎无法想出这个。请原谅我缺乏知识,我是初学者,现在还在学习。
我希望应用程序能够查看和编辑自己的个人资料。现在,当登录到应用程序时,它提供“无路由匹配{:action =&gt;”show“,:controller =&gt;”profiles“,:id =&gt; nil}缺少必需的键:[:id]”< / p>
_navigation_links.html.erb
<% if user_signed_in? %>
<li><%= link_to('Sign Out', destroy_user_session_path, :method => :delete) %></li>
<li><%= link_to "View Profile", profile_path(@profile) %></li>
<li><%= link_to 'Edit', edit_profile_path(@profile) %></li>
<% else %>
<li><%= link_to "Sign Up", new_user_registration_path %></li>
<li><%= link_to "Sign In", new_user_session_path %></li>
<% end %>
profiles_controller.rb
class ProfilesController < ApplicationController
before_action :find_profile, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!
def index
@profiles = Profile.all
end
def show
@profile = Profile.find(params[:id])
end
def new
@profile = current_user.profile.build
end
def edit
end
def create
@profile = Profile.new(profile_params)
@profile.save
redirect_to @profile
end
def update
@profile = Profile.find(params[:id])
if @profile.update(profile_params)
redirect_to @profile
else
render 'edit'
end
end
private
def find_profile
@profile = Profile.find(params[:id])
end
def profile_params
params.require(:profile).permit(:id, :name, :summary, :birthday, :user_id)
end
end
的routes.rb
Rails.application.routes.draw do
devise_for :users
resources :contacts, only: [:new, :create]
resources :visitors, only: [:new, :create]
root to: 'visitors#new'
resources :posts
resources :profiles
end
根据我的理解,当用户登录应用程序时,应用程序无法找到配置文件页面的ID。我猜这个ID需要在用户注册时同时创建。但是我不确定如何实现这种逻辑。
答案 0 :(得分:0)
我也是rails的新手,但我的猜测是你的@ profile.save不成功且@profile没有id。如果无法将配置文件保存到数据库,则保存将返回false。所以,添加如下内容:
if @profile.save
redirect_to @profile
else
redirect_to 'new'
end
就像你做的更新一样。 您可能在生成配置文件模型后错过了运行db迁移吗?
答案 1 :(得分:0)
@profile
作为user_signed_in?
中的profile_path
路由助手依赖于_navigation_links.html.erb
时,您需要在每个页面请求上设置user_is_signed_in?
。
因此,如果ProfilesController#index
,但是在执行@profile
操作的profiles_page上,则会失败,因为您只为[:show, :edit, :update, :destroy]
设置Task task = new Task<Void>() {
@Override public Void call() {
for(int i=0; i<filmInfoList.size(); i++){
updateProgress(i+1, filmInfoList.size());
if(filmInfoList.get(i).getImageURL() != null) {
FilmSearchResult film = filmInfoList.get(i);
Image searchItemImage = new Image(film.getImageURL());
ImageView searchItemImageView = new ImageView(searchItemImage);
searchItemImageView.setPreserveRatio(true);
searchItemImageView.setOnMouseClicked(e -> showDetails(film));
Platform.runLater(() -> {
searchmoviesTilePane.getChildren().add(searchItemImageView);
});
}
}
return null;
}
};
// ....
private void showDetails(FilmSearchResult film) {
// show details for film...
}
。