Odczytywanie zmiennej w widoku

Witam

Mam np taki kontroler:

[code]class UserController < ApplicationController
def authenticate
#User.new(params[:userform]) will create a new object of User, retrieve values from the form and store it variable @user.
@user = User.new(params[:userform])
#find records with username,password
valid_user = User.find(:first,:conditions => [“user_name = ? and password = ?”,@user.user_name, @user.password])

    #if statement checks whether valid_user exists or not
	if valid_user
    #creates a session with username
		session[:user_id]=valid_user.user_name
  @uuus = valid_user.user_name
    #redirects the user to our private page.
		redirect_to :action => 'private'
	else
		flash[:notice] = "Invalid User/Password"
		redirect_to :action=> 'login'
	end

end

def login
end

def private
if !session[:user_id]
redirect_to :action=> ‘login’
end
end

def private2
if !session[:user_id]
redirect_to :action=> ‘login’
end
end

def logout
if session[:user_id]
reset_session
redirect_to :action=> ‘login’
end
end

end[/code]
tam jest zmienna:

@uuus = valid_user.user_name

i teraz mam pytanie jak ją odczytywać w widoku?
nie ma znaczenia co jest do niej przypisane

Normalnie, @uuus, masz dostęp do zmiennych globalnych w widokach

Piotr ma rację w tym sensie, że zmienne instancyjne kontrolera (tzn. te z @) masz dostępne w widokach.
Ale skąd mu do łba przyszło że są to globalne, to nie mam pojęcia.

a jak chciałbym mieć dostęp do tej zmiennej w innym kontrolerze?

Ale po co, w sensie możesz podać przykład zastosowania / zaistnienia takiej sytuacji?

To masz problem :wink:

A tak na serio. Protokół HTTP jest bezstanowy, więc przy normalnym wywołaniu request -> response, nie możesz po prostu odczytać zawartość jakiejś zmiennej z innego kontrolera. Jednym ze sposobów przekazywania informacji pomiędzy requestami jest użycie sesji.

Najlepiej napisz co chcesz uzyskać, a wtedy łatwiej będzie napisać jakiego sposobu powinieneś użyć.

Aa, koledze chodziło o persystencję zmiennej pomiędzy requestami / akcjami?

Może źle kombinuje, ale chodzi mi o taką np sytuację, gdzie użytkownik wybiera jakieś miasto, po czym ‘id’ tego miasta potrzebuje przekazać do innego kontrolera, aby z kolei wyciągnąć z innej tabeli jakieś dane znajdujące się pod tym ‘id’…
hmm…a może można to wszystko zrobić w jednym kontrolerze?

Już sobie chyba znalazłem rozwiazanie…
dość oczywiste…sory za kłopot…
jeśli nie wypali to jeszcze poprosze o pomoc:)
Pozdrawiam

Szkoda, że nie napisałeś jakie to rozwiązanie

Zmienna klasowa? :smiley:
Globalna? :smiley: :smiley: :smiley:

O ile dobrze to wymyśliłem to w jednym kontrolerze podaje w metodzie:

			redirect_to :action => 'uuu', :controller =>'article',:zm=>"cos tam"

potem w kontrolerze ‘article’ odczytuje tą zmienną poprzez:

         flash[:rrr]=params[:zm]

i w widoku ‘uuu’ po prostu:

<%=flash[:rrr] %>

Pewnie to nie jest poprawne ale działa.

Zasadniczo trop poprawny, ale zazwyczaj nie ma potrzeby korzystania z flasha - uzasadnione jest tylko przy redirectach. W pozostałych przypadkach po prostu przekazujesz to
jako parametr do funkcji “link_to” albo “link_to_remote” i odczytujesz też przez params[…] jw.

Mam kolejny problem powiązany z tym co wyżej. Mając kontroler w którym pobieram sobie ‘id’ zalogowanego użytkownika:

[code]class UserController < ApplicationController
def authenticate
#User.new(params[:userform]) will create a new object of User, retrieve values from the form and store it variable @user.
@user = User.new(params[:userform])
#find records with username,password
valid_user = User.find(:first,:conditions => [“user_name = ? and password = ?”,@user.user_name, @user.password])

    #if statement checks whether valid_user exists or not
	if valid_user
    #creates a session with username
		session[:user_id]=valid_user.user_name
    #redirects the user to our private page.
		redirect_to :action => 'uuu', :controller =>'article',:zm=>valid_user.id
	else
		flash[:notice] = "Invalid User/Password"
		redirect_to :action=> 'login'
	end

end
.
.
.[/code]
(to jego istotna część)
przekazuje do innego kontrolera ‘article’ to ‘id’ i na stronie ‘uuu’ chce wyświetlić artykuły użytkownika o takim ‘id’
to ten kontroler:

[code]class ArticleController < ApplicationController
def uuu
@article = Article.new(params[:articleform])

  @aart = Article.find(:first,:conditions =>["user_id = ?",params[:zm]])

end
end[/code]
a to widok ‘uuu’

[code]

<% for column in Article.content_columns %> <% end %>

<% for name in @aart %>

<% for column in Article.content_columns %> <% end %> <% end %>
<%= column.human_name %>
<%=h name.send(column.name) %>
[/code] ale coś jest nie tak. mogę wiedzieć co?

dostejesz jakiś błąd ?

dostaje taki błąd

[code] NoMethodError in Article#uuu

Showing app/views/article/uuu.rhtml where line #11 raised:

undefined method `each’ for #Article:0x86891e4

Extracted source (around line #11):

8: <% end %>
9:
10:
11: <% for name in @aart %>
12:


13: <% for column in Article.content_columns %>
14: <%=h name.send(column.name) %>[/code]
a tutaj logi

[code]Processing UserController#login (for 127.0.0.1 at 2010-05-27 18:14:52) [GET]
Session ID: d9925b2c97f976904a1a445ec9a4d57a
Parameters: {“action”=>“login”, “controller”=>“user”}
Rendering user/login
Completed in 0.00500 (200 reqs/sec) | Rendering: 0.00400 (80%) | 200 OK [http://localhost/user/login]

Processing UserController#authenticate (for 127.0.0.1 at 2010-05-27 18:14:58) [POST]
Session ID: d9925b2c97f976904a1a445ec9a4d57a
Parameters: {“userform”=>{“password”=>“admin”, “user_name”=>“admin”}, “action”=>“authenticate”, “controller”=>“user”}
e[4;36;1mUser Columns (0.001000)e[0m e[0;1m select column_name as name, data_type as sql_type, data_default, nullable,
decode(data_type, ‘NUMBER’, data_precision,
‘FLOAT’, data_precision,
‘VARCHAR2’, data_length,
null) as limit,
decode(data_type, ‘NUMBER’, data_scale, null) as scale
from all_tab_columns
where owner = ‘SYSTEM’
and table_name = ‘USERS’
order by column_id
e[0m
e[4;35;1mUser Load (0.001000)e[0m e[0mselect * from (select raw_sql_.*, rownum raw_rnum_ from (SELECT * FROM users WHERE (user_name = ‘admin’ and password = ‘admin’) ) raw_sql_ where rownum <= 1) where raw_rnum_ > 0e[0m
Redirected to http://localhost:3000/article/uuu?zm=1.0
Completed in 0.11700 (8 reqs/sec) | DB: 0.00200 (1%) | 302 Found [http://localhost/user/authenticate]

Processing ArticleController#uuu (for 127.0.0.1 at 2010-05-27 18:14:59) [GET]
Session ID: d9925b2c97f976904a1a445ec9a4d57a
Parameters: {“action”=>“uuu”, “controller”=>“article”, “zm”=>“1.0”}
e[4;36;1mArticle Columns (0.001000)e[0m e[0;1m select column_name as name, data_type as sql_type, data_default, nullable,
decode(data_type, ‘NUMBER’, data_precision,
‘FLOAT’, data_precision,
‘VARCHAR2’, data_length,
null) as limit,
decode(data_type, ‘NUMBER’, data_scale, null) as scale
from all_tab_columns
where owner = ‘SYSTEM’
and table_name = ‘ARTICLES’
order by column_id
e[0m
e[4;35;1mArticle Load (0.001000)e[0m e[0mselect * from (select raw_sql_., rownum raw_rnum_ from (SELECT * FROM articles WHERE (user_id = 1) ) raw_sql_ where rownum <= 1) where raw_rnum_ > 0e[0m
e[4;36;1mArticle Load (0.002000)e[0m e[0;1mselect * from (select raw_sql_.
, rownum raw_rnum_ from (SELECT * FROM articles WHERE (user_id = 1) ) raw_sql_ where rownum <= 1) where raw_rnum_ > 0e[0m
e[4;35;1mArticle Load (0.002000)e[0m e[0mSELECT * FROM articles WHERE (articles.id = 1) e[0m
Rendering article/uuu

ActionView::TemplateError (undefined method `each’ for #Article:0x86891e4) on line #11 of app/views/article/uuu.rhtml:
8: <% end %>
9:


10:
11: <% for name in @aart %>
12:
13: <% for column in Article.content_columns %>
14: <%=h name.send(column.name) %>
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1860:in `method_missing'
#{RAILS_ROOT}/app/views/article/uuu.rhtml:11:in `_run_rhtml_47app47views47article47uuu46rhtml'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:326:in `send'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:326:in `compile_and_render_template'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:301:in `render_template'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:260:in `render_file'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:806:in `render_file'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:711:in `render_with_no_layout'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/layout.rb:256:in `render_without_benchmark'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/benchmarking.rb:50:in `render'
c:/ruby/lib/ruby/1.8/benchmark.rb:293:in `measure'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/benchmarking.rb:50:in `render'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:1096:in `perform_action_without_filters'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/filters.rb:632:in `call_filter'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/filters.rb:619:in `perform_action_without_benchmark'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/benchmarking.rb:66:in `perform_action_without_rescue'
c:/ruby/lib/ruby/1.8/benchmark.rb:293:in `measure'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/benchmarking.rb:66:in `perform_action_without_rescue'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/rescue.rb:83:in `perform_action'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:430:in `send'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:430:in `process_without_filters'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/filters.rb:624:in `process_without_session_management_support'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/session_management.rb:114:in `process'
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:330:in `process'
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/dispatcher.rb:41:in `dispatch'
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/webrick_server.rb:113:in `handle_dispatch'
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/webrick_server.rb:79:in `service'
c:/ruby/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
c:/ruby/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
c:/ruby/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
c:/ruby/lib/ruby/1.8/webrick/server.rb:162:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
c:/ruby/lib/ruby/1.8/webrick/server.rb:95:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:92:in `each'
c:/ruby/lib/ruby/1.8/webrick/server.rb:92:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:23:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:82:in `start'
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/webrick_server.rb:63:in `dispatch'
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/commands/servers/webrick.rb:59
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in `require'
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in `require'
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/commands/server.rb:39
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
script/server:3

Rendering c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/templates/rescues/layout.rhtml (500 Internal Error)[/code]

@aart to tylko jeden artykuł:

@aart = Article.find(:first,:conditions =>["user_id = ?",params[:zm]])

poprzez

for x in y

bierzesz poszczególne elementy z y, który musi być więc tablicą

więc jak powinno to wyglądać? czyżby chodziło o parametr ‘:first’?

<% @aart.each |aa| do %>
<%= aa.jakasmetoda -%>
<% end %>

już wszystko gra…zamieniłem ‘:first’ na ‘:all’ i jest ok.
Ale jest inny problem, bo kiedy pobieram sobie id usera który się loguje np. ‘2’ to przekazując do drugiego kontrolera otrzymuje id=‘2.0’ i to już jest błąd bo on nie widzi takiego id…jak to można zmienić?